.NET 字符串哈希函数可移植吗? [重复]

问题描述 投票:0回答:4

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

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

"my string".GetHashCode()

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

问题是:

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

来自 MSDN:

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

所以不,你不能假设

GetHashCode
产生的值是稳定的。这也不仅仅是理论上的 - 我们过去已经看到了价值的变化

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



3
投票

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

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


3
投票

不。它不便于携带。除了平衡哈希树之外,您不应该使用此方法进行任何其他操作。它的实现在框架版本之间发生了变化,并且对于 32 位/64 位 CLR 的行为有所不同。 Eric Lippert 有一篇关于此函数的规则和正确用法的

博客文章

相反,您应该使用

SHA1Managed

 将哈希值插入数据库。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.