Reverse Engineering String.GetHashCode

后端 未结 4 1327
梦毁少年i
梦毁少年i 2021-01-06 08:17

String.GetHashCode\'s behavior is depend on the program architecture. So it will return one value in x86 and one value on x64. I have a test application which must run in x8

4条回答
  •  粉色の甜心
    2021-01-06 09:08

    While all of the warnings given here are valid, they don't answer the question. I had a situation in which GetHashCode() was unfortunately already being used for a persisted value in production, and I had no choice but to re-implement using the default .NET 2.0 32-bit x86 (little-endian) algorithm. I re-coded without unsafe as shown below, and this appears to be working. Hope this helps someone.

    // The GetStringHashCode() extension method is equivalent to the Microsoft .NET Framework 2.0
    // String.GetHashCode() method executed on 32 bit systems.
    public static int GetStringHashCode(this string value)
    {
        int hash1 = (5381 << 16) + 5381;
        int hash2 = hash1;
    
        int len = value.Length;
        int intval;
        int c0, c1;
        int i = 0;
        while (len > 0)
        {
            c0 = (int)value[i];
            c1 = (int)value[i + 1];
            intval = c0 | (c1 << 16);
            hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ intval;
            if (len <= 2)
            {
                break;
            }
            i += 2;
            c0 = (int)value[i];
            c1 = len > 3 ? (int)value[i + 1] : 0;
            intval = c0 | (c1 << 16);
            hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27)) ^ intval;
            len -= 4;
            i += 2;
        }
    
        return hash1 + (hash2 * 1566083941);
    }
    

提交回复
热议问题