当前位置:编程学习 > C#/ASP.NET >>

关于哈希值的一个问题

数据库表中的一个列是通过程序获得哈希值以后存入的,
怎样用C#把数据库中的值转化成未哈希以前的值呢?
求各位大虾指点迷津... --------------------编程问答-------------------- 那太麻烦了吧? --------------------编程问答-------------------- google一下,好像有个MD5cracker的东西....... --------------------编程问答-------------------- Hash算法理论上是不可逆的...目前不可能实现...

MD5cracker之类的也只是字典匹配而已...

ps:莫非你想破解密码? --------------------编程问答-------------------- 如果我不把这个列做处理的话,把数据库中的数据读到DataGridView里面的时候就会产生数据错误!
如果不去解哈希的问题,大虾们有什么好的办法解决报错的问题? --------------------编程问答-------------------- 很简单...不要在数据源中显示该列...这种数据不是给人看的...提供单独的方法处理该列... --------------------编程问答-------------------- 有什么意义吗? --------------------编程问答-------------------- 恩,明白了。谢谢楼上的!
明天把分数散给大家!谢谢大家的帮忙! --------------------编程问答-------------------- 楼主太强了,这个也能想到,
哈希值在整数来说,和整数值一致,例如int i = 1; i.GetHashCode()就等于 1。
对于字符串来说,微软采用了一种算法,string s="abc"; s.GetHashCode()就等于 'a' * 某素数 + 'b' * 某素数 + 'c' * 某素数.
很明显,这种加数是不可逆的。就如同我告诉你 5,你就不知道我是 2+3 还是 4+1 得到的。
但添加素数再相加就是尽量避免 5 这种适应性强的结果出现,尽量保证字符串哈希码不同(但还是会相同)。非要结果的话,只有枚举任何可能的结果,对比他们的哈希值。
using System;

class Program
{
    // 递归测试 "" 到 "zzzzz" 的所有组合,找出哈希值相同的
    // 即使火星撞地球般的出现多个结果,也不会很多
    public static void Find(int hash_code, string s)
    {
        if (s.GetHashCode() == hash_code)
            Console.WriteLine(s);
        // 看着 s + c ,让我不禁想用 StringBuilder,不过我懒,就这样吧
        if (s.Length < 5)
            for (char c = 'a'; c <= 'z'; c++)
                Find(hash_code, s + c);
        return;
    }

    static void Main(string[] args)
    {
        int hash_code = "abcd".GetHashCode();

        // 假如知道原字符串范围,是个纯英文5个字母以内的,可以挨个试
        Find(hash_code, "");
    }
}

假如会显示出两个字符串,一定要去买易做图,肯定中 --------------------编程问答-------------------- 这是Reflector反编译出来的字符串的哈希算法,你看看吧。这是不可逆的运算。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public override unsafe int GetHashCode()
{
    fixed (char* str = ((char*) this))
    {
        char* chPtr = str;
        int num = 0x15051505;
        int num2 = num;
        int* numPtr = (int*) chPtr;
        for (int i = this.Length; i > 0; i -= 4)
        {
            num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
            if (i <= 2)
            {
                break;
            }
            num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
            numPtr += 2;
        }
        return (num + (num2 * 0x5d588b65));
    }
}


--------------------编程问答-------------------- 密码为什么要列在grid中 --------------------编程问答-------------------- --------------------编程问答-------------------- 我们基本都不用哈希表了,都用XML来进行前后台联系了 --------------------编程问答-------------------- 如果是破解非对称密匙的,劝你放弃,或者使用网上的一些小工具。 --------------------编程问答-------------------- 这个可能得借助其他东西  C#里好像没有这个功能
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,