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

Max*_*Max 15 .net c# hash portability

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

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

"my string".GetHashCode()
Run Code Online (Sandbox Code Playgroud)

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

问题是:

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

Mic*_*tta 19

来自MSDN:

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

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

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

  • `System.String`覆盖`GetHashCode`,并在[其文档]中包含类似的注释(http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx):*的行为GetHashCode依赖于它的实现,它可能从公共语言运行库的一个版本变为另一个版本.可能发生这种情况的原因是为了提高GetHashCode的性能.*和*GetHashCode返回的值与平台有关.它在32位和64位版本的.NET Framework上有所不同.* (3认同)