zoukankan      html  css  js  c++  java
  • 你知道吗string GetHashCode方法跟环境是有关的吗?

    系统被测出一个bug,在本地正常在服务器上不正常代码完全全部重传了一遍还是不正常。
    后面突然想到我用的是hashcode.
    会不会是同一个iis下,当是站点不一样造成hashcode的计算结果不一样。

    然后就开LinqPad起来测试发现 GetHashCode()方法跟环境确实有关系。


    然后我们再试一下在asp.net环境当中的

     

    还是只有两个一样的值,这回有意思了, 没有出现新的值。
    我们期待的是有新的不同的值,这样就可以直接证明它的值是跟运行环境有关了。 不同环境得到的值都不一样。

    用Reflector看一下它的代码是什么写的, 直接看还真的是看不出有跟环境有关的代码

     
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    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));
        }
    }

    这时候我突然想到的是会不会 64位 或32位的问题,因为我的操作系统是64位的,然后虚拟机是32位的。
    接下来我就继续测试一下IIS的设置看看是不是真的是这个问题

     

    可以通过改IIS里面的Application pool ,果然是哪个问题。当设置成64位的时候哪个值是1670610771 32位的值是1152132852 
    确定了之后我们就可以用Reflector加载64位的dll来查看它的代码 
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    public override unsafe int GetHashCode()
    {
        
    fixed (char* str = ((char*this))
        {
            
    int num3;
            
    char* chPtr = str;
            
    int num = 0x1505;
            
    int num2 = num;
            
    for (char* chPtr2 = chPtr; (num3 = chPtr2[0]) != '\0'; chPtr2 += 2)
            {
                num 
    = ((num << 5+ num) ^ num3;
                num3 
    = chPtr2[1];
                
    if (num3 == 0)
                {
                    
    break;
                }
                num2 
    = ((num2 << 5+ num2) ^ num3;
            }
            
    return (num + (num2 * 0x5d588b65));
        }
    }

    两个是不一样的。
    原来影响它的环境只是 net framework 版本的不同造成的

  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/lovebanyi/p/1846725.html
Copyright © 2011-2022 走看看