.NET字符串哈希函数是否可移植?
可能重复:
如何在.net(c#)中创建一个可以安全存储在数据库中的字符串的HashCode?
我使用C#4.0并通过调用获取字符串哈希:
"my string".GetHashCode()
此调用生成的代码将存储到数据库中以供将来使用。 此哈希码用于查找字符串的某个子集,然后进行相等比较。
问题是:
- 它是标准化的哈希计算吗? 我是否可以假设可以在不同的环境中计算相同的哈希值,例如.Net 3.0中的C#或未来的.Net版本?
- 是否可以通过用Java,PL / SQL,Ruby等编写自己来计算相同的哈希函数?
- 我可以假设今天生成的哈希在明天在同一环境中是相同的吗? 例如,当我关闭计算机并再次运行程序,或更改区域设置或其他一些设置时?
- 便携性的限制是什么?
- 我知道我可以自己做,但也许提供某种便携性?
来自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
将哈希插入数据库。