假设使用相同的字符串值,GetHashCode()的返回值是否保证一致?(C#/ ASP.NET)
我今天将我的代码上传到服务器,令我惊讶的是我不得不重新索引一些数据,因为我的服务器(win2008 64位)与台式机相比返回了不同的值.
Jon*_*nas 31
如果我没有弄错,GetHashCode在给定相同值的情况下是一致的,但不保证在不同版本的框架中保持一致.
从String.GetHashCode()上的MSDN文档:
GetHashCode的行为取决于其实现,该实现可能从公共语言运行库的一个版本更改为另一个版本.可能发生这种情况的原因是为了提高GetHashCode的性能.
小智 11
我有一个类似的问题,我在数据库表中填充了依赖于String.GetHashCode(不是最好的主意)的信息,当我升级服务器时,我正在研究x64,我注意到我从String.GetHashCode得到的值是与表中已有的内容不一致.我的解决方案是使用我自己的GetHashCode版本,它在x86框架上返回与String.GetHashCode相同的值.
这是代码,不要忘记编译"允许不安全的代码":
/// <summary>
/// Similar to String.GetHashCode but returns the same as the x86 version of String.GetHashCode for x64 and x86 frameworks.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static unsafe int GetHashCode32(string s)
{
fixed (char* str = s.ToCharArray())
{
char* chPtr = str;
int num = 0x15051505;
int num2 = num;
int* numPtr = (int*)chPtr;
for (int i = s.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));
}
}
Run Code Online (Sandbox Code Playgroud)