我可以依赖GetHashCode()的值来保持一致吗?

pub*_*tic 15 c# hash

假设使用相同的字符串值,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)


Jac*_*ing 5

实现取决于框架的版本,但也取决于体系结构.string.GetHashCode()的实现在框架的x86和x64版本中是不同的,即使它们具有相同的版本号.