首页 新闻 会员 周边

为什么对于同样的字符串str,str.GetHashCode()结果不同

0
[已解决问题] 解决于 2010-02-26 22:15

今天做了一个实验.

在x86的PC上对于一个字符串使用GetHashCode()获取一个字符串的Hash

(在PC上试验了WinForm和Asp.Net,结果是一样的)

在Xscale CPU的WinCE上边对于同样的字符串也使用GetHashCode()获取Hash

(在WinCE设备上和PPC2003、WM5、WM6模拟器的模拟器上结果都相同)

然后比较发现他们俩不一样!这是为什么呢?

 

刚才Google了一下,有说对于同样一个对象X86和X64平台下GetHashCode()的结果是不一样的。

为什么不一样没说。

我想问下为什么不一样呢?难道跟CPU有关?

Google使用关键字GetHashCode CPU 结果令人失望!

谁能给个解释啊?

问题补充: 怎样才能让他们一样呢?
编程浪子_的主页 编程浪子_ | 菜鸟二级 | 园豆:348
提问于:2010-02-21 23:11
< >
分享
最佳答案
0

不要使用GetHashCode()来做类似字符串加密的事情。而是使用md5或sha1算法来做这件事。

GetHashCode()的算法甚至还会根据Framework的版本更新而变化的。

有这样的故事,曾经有公司使用GetHashCode()来hash password,结果升级了新的.net版本,所有用户再也登录不上了...

vons | 小虾三级 |园豆:1033 | 2010-02-22 18:11
有这样的故事,曾经有公司使用GetHashCode()来hash password,结果升级了新的.net版本,所有用户再也登录不上了... 你说的也太神了!!! 我的理解在上边.谢谢
编程浪子_ | 园豆:348 (菜鸟二级) | 2010-02-26 22:15
其他回答(1)
0

反编译String的GetHashCode看了看,其中需要用到实例的指针地址来计算HashCode,估计和这个有关系。呵呵,问题挺有意思的。

Jon | 园豆:205 (菜鸟二级) | 2010-02-22 13:10
.NET下的String的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的.还用到了指针,在.Net下变我都没用过指针呢! 感觉就是一些字符变换的东西! CF的反编译回来什么都没有.没法比较! 总的感觉是:跟.NET环境有关,因为函数可能不同... 跟CPU架构有关,因为不同CPU中int num = 0x15051505;int* numPtr 还有移位操作num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1]; 的结果都是不一样的!
支持(0) 反对(0) 编程浪子_ | 园豆:348 (菜鸟二级) | 2010-02-26 22:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册