【发布时间】:2011-11-23 22:51:10
【问题描述】:
令我惊讶的是,以下方法在调试和发布中产生了不同的结果:
int result = "test".GetHashCode();
有什么办法可以避免吗?
我需要一种可靠的方法来散列字符串,并且我需要该值在调试和发布模式下保持一致。如果可能,我想避免编写自己的哈希函数。
为什么会这样?
仅供参考,反射器给了我:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), SecuritySafeCritical]
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));
}
}
【问题讨论】:
-
如果你需要哈希码保持一致,你就用错了。如果我没记错的话,他们明确强制它在调试模式下不一致,这样微软内部就没有人依赖它。
-
GetHashCode 在 .NET 32 位和 .NET 64 位上也返回不同的值。
标签: c# string debugging release gethashcode