现在的位置: 首页 > 综合 > 正文

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

2013年01月26日 ⁄ 综合 ⁄ 共 1702字 ⁄ 字号 评论关闭

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

 

 

抱歉!评论已关闭.