我犯了一个错误,那就是将String.GetHashCode()
设为稳定,因此我通过结合32位String.GetHashCode()
构建了一些“唯一的” 128位哈希。而且,确实在MSDN文档中,我不应该采用这种方法来保持稳定,因为在32位应用程序上我没有相同的哈希值。
我无法回滚,因为所有数据都写有此错误。
不要在这一点上对我大喊大叫。
现在,我需要以64位平台格式恢复GetHashCode()的实际实现,以稳定我的代码。
有没有可以找到的地方?
此64位实现应返回(我使用.NET 4.7.0)
"a".GetHashCode() == 372029373; // Should be true
答案 0 :(得分:0)
对于那些犯同样错误的人,我从评论员的文档中构建了此实现。这是以下特征的默认实现:
public static class StringHashExtensions
{
public static unsafe int GetHashCode64BitsRelease(this string str)
{
unsafe
{
fixed (char* src = str)
{
int hash1 = 5381;
int hash2 = hash1;
int c;
char* s = src;
while ((c = s[0]) != 0)
{
hash1 = ((hash1 << 5) + hash1) ^ c;
c = s[1];
if (c == 0)
break;
hash2 = ((hash2 << 5) + hash2) ^ c;
s += 2;
}
return hash1 + (hash2 * 1566083941);
}
}
}
}