关于WinCE和PC中同一字符串的GetHashCode()结果不同的理解

本文探讨了在不同.NET环境中,如WinForm、Asp.Net及WinCE等平台下,同一字符串使用GetHashCode()方法得到的哈希值为何存在差异。通过分析System.String.GetHashCode()的源码,解释了其与.NET环境和CPU架构的关系。

前几天碰到一个问题是这样的:我在博问里边提了下:

问题地址是: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]; 的结果都是不一样的!

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值