关于哈希值的一个问题
数据库表中的一个列是通过程序获得哈希值以后存入的,怎样用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#