文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>你知道吗string GetHashCode方法跟环境是有关的?

你知道吗string GetHashCode方法跟环境是有关的?

时间:2010-10-09  来源:lovebanyi

系统被测出一个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 版本的不同造成的

 

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载