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