我有下面的散列函数,我正在尝试用我的方法来反转它,这样我就可以从散列值中找到键。
uint Hash(string s)
{
uint result = 0;
for (int i = 0; i < s.Length; i++)
{
result = ((result << 5) + result) + s[i];
}
return result;
}
代码是用 C# 编写的,但我认为它很清楚。
我知道对于一个散列值,可以有多个键,但我的目的不是全部找到,只要一个满足散列函数就足够了。
编辑:
函数接受的字符串仅由数字 0 到 9 以及字符“*”和“#”组成,因此 Unhash 函数也必须遵守此标准。
有什么想法吗?谢谢。
最佳答案
这应该反转操作:
string Unhash(uint hash)
{
List<char> s = new List<char>();
while (hash != 0)
{
s.Add((char)(hash % 33));
hash /= 33;
}
s.Reverse();
return new string(s.ToArray());
}
这应该返回一个字符串,该字符串提供与原始字符串相同的散列,但不太可能是完全相同的字符串。
关于c# - 反转哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4523553/