前几天碰到一个问题是这样的:我在博问里边提了下:
问题地址是:http://space.cnblogs.com/question/12395/
在x86的PC上对于一个字符串使用GetHashCode()获取一个字符串的Hash
(在PC上试验了WinForm和Asp.Net,结果是一样的)
在Xscale CPU的WinCE上边对于同样的字符串也使用GetHashCode()获取Hash
(在WinCE设备上和PPC2003、WM5、WM6模拟器的模拟器上结果都相同)
然后比较发现他们俩不一样!这是为什么呢?
刚才Google了一下,有说对于同样一个对象X86和X64平台下GetHashCode()的结果是不一样的。
为什么不一样没说。
Google使用关键字GetHashCode CPU 结果令人失望!
今天又想起来这个问题。于是用Reflector察看了一下System.String.GetHashCode(); 恍然大悟。
GetHashCode()代码如下:
[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)); } }
MSDN上说fixed是不支持CF的.所以CF下肯定用了别的函数。CF的mscorelib.dll反编译回来只有函声明,没有实现,没法比较。
还用到了指针,在.Net下变我都没用过指针呢! 感觉就是一些字符变换的东西! 使用指针就跟CPU架构有关
CF的反编译回来什么都没有.没法比较!
总的感觉是:
1、GetHashCode() 跟.NET环境有关,因为函数可能不同...
2、跟CPU架构有关,因为不同CPU中
int num = 0x15051505;
int 型的溢出值
int* numPtr 指针的地址范围
尤其是移位操作num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1]; 的结果都是不一样的!