.NET字符串哈希函数是否可移植?

时间:2011-11-06 18:58:39

标签: c# .net hash portability

  

可能重复:
  How do I create a HashCode in .net (c#) for a string that is safe to store in a database?

我使用C#4.0并通过调用获取字符串哈希:

"my string".GetHashCode()

此调用生成的代码存储在数据库中以备将来使用。此哈希码用于查找字符串的某个子集,然后进行相等的比较。

问题是:

  1. 是标准化哈希计算吗?我可以假设它是 可以在不同的环境中计算相同的哈希,例如.Net 3.0中的C#或未来的.Net版本?
  2. 是否可以通过用Java,PL / SQL,Ruby等编写自己来计算相同的哈希函数?
  3. 我可以假设今天生成的哈希明天将会是相同的 同样的环境?例如,当我关闭我的电脑和 再次运行程序,或更改区域设置,或其他一些设置?
  4. 便携性的限制是什么?
  5. 我知道我可以自己做,但也许提供某种便携性?

4 个答案:

答案 0 :(得分:19)

来自MSDN:

  

GetHashCode方法的默认实现不保证不同对象的唯一返回值。此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NET Framework之间是相同的。因此,不得将此方法的默认实现用作散列目的的唯一对象标识符。

所以不,你不能假设GetHashCode产生的价值是稳定的。这不仅仅是理论上的 - we've seen the value change in the past

如果你想要一个稳定的哈希,你必须自己生成它。

答案 1 :(得分:18)

答案 2 :(得分:3)

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

  

.NET Framework不保证默认实现   GetHashCode方法,它返回的值将是相同的   在不同版本的.NET Framework之间。因此,   此方法的默认实现不得用作唯一   用于散列目的的对象标识符。

答案 3 :(得分:2)

没有。它不便携。您应该从不将此方法用于平衡哈希树之外的任何其他方法。它的实现在Framework版本之间发生了变化,对于32位/ 64位CLR的行为也有所不同。

Eric Lippert对此功能的规则和正确用途有blog post

相反,您应该使用SHA1Managed将哈希插入数据库。