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

可能重复:
如何在.net(c#)中创建一个可以安全存储在数据库中的字符串的HashCode?

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

"my string".GetHashCode() 

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

问题是:

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

来自MSDN:

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

所以不,你不能假设GetHashCode产生的值是稳定的。 这不仅仅是理论上的 – 我们已经看到了过去的价值变化 。

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

规则:GetHashCode的消费者不能依赖它随着时间的推移或跨appdomains的稳定性 。

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

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

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

Eric Lippert有一篇关于此function的规则和正确用途的博客文章 。

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