【问题标题】:Is the .NET string hash function portable? [duplicate].NET 字符串散列函数是否可移植? [复制]
【发布时间】:2011-11-06 18:58:39
【问题描述】:

可能重复:
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 或未来的 .Net 版本中的 C#)中计算相同的哈希?
  2. 是否可以通过用 Java、PL/SQL、Ruby 等编写自己来计算相同的哈希函数?
  3. 我可以假设今天生成的哈希明天在 一样的环境?例如,当我关闭计算机并 再次运行程序,或者更改语言环境或其他一些设置?
  4. 可移植性有哪些限制?
  5. 我知道我可以自己做,但也许提供了某种可移植性?

【问题讨论】:

  • 您的问题的答案是不,不,不,不,不,没有任何“可移植性”,也没有任何“可移植性”。 在任何情况下,您都不应做您所描述的事情。

标签: c# .net hash portability


【解决方案1】:

来自 MSDN:

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

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

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

【讨论】:

  • "默认实现" - String 使用默认实现吗?老实说,我不知道,我只是没想到(因为它们在哈希表中按值处理)。
  • System.String 覆盖GetHashCode,并在its documentation 中包含类似的注释:GetHashCode 的行为取决于其实现,这可能会从公共语言运行时的一个版本发生变化给另一个。可能发生这种情况的一个原因是为了提高 GetHashCode 的性能。,并且 GetHashCode 返回的值是平台相关的。它在 .NET Framework 的 32 位和 64 位版本上有所不同。
【解决方案2】:

【讨论】:

  • +1 直接来自 Eric Lippert 本人的知识。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    没有。它不是便携式的。您应该永远将此方法用于平衡哈希树以外的任何事情。它的实现在不同版本的框架之间发生了变化,并且在 32 位 / 64 位 CLR 中表现不同。

    Eric Lippert 有一个blog post 说明此功能的规则和正确使用。

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

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2013-11-16
      • 2014-01-09
      相关资源
      最近更新 更多