详细内容
string GetHashCode不同环境生成的结果不一致
发布日期:2015-05-21     点击:4899     字体:[ ]

string GetHashCode与Framework是32位还是64位有关

 

项目中遇到调试时同样的字符串与部署后生成的GetHashCode值不同,就开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));
    }
}
 
 
两个是不一样的。
所以string GetHashCode与Framework是32位还是64位有关
用户评论
昵称 
内容  *
验证码   
   
Copyright © 2010 zdbase.com All Rights Reserved. 苏ICP备15039389号 可人软件设计