c# - C# 中的 GetHashCode 指南

标签 c# .net hashcode

我在 Essential C# 3.0 和 .NET 3.5 书中读到:

GetHashCode()’s returns over the life of a particular object should be constant (the same value), even if the object’s data changes. In many cases, you should cache the method return to enforce this.



这是一个有效的指南吗?

我在 .NET 中尝试了几种内置类型,但它们的行为并不像这样。

最佳答案

答案主要是,它是一个有效的指南,但可能不是一个有效的规则。它也没有讲述整个故事。

重点是对于可变类型,您不能将哈希码基于可变数据,因为两个相等的对象必须返回相同的哈希码,并且哈希码必须在对象的生命周期内有效。如果散列码改变,你最终会得到一个对象,它会在散列集合中丢失,因为它不再存在于正确的散列箱中。

例如,对象 A 返回 1 的哈希值。因此,它进入哈希表的 bin 1。然后更改对象 A 使其返回 2 的散列值。当散列表查找它时,它会在 bin 2 中查找但找不到 - 该对象在 bin 1 中是孤立的。这就是散列码必须的原因在对象的生命周期内不会改变,这只是编写 GetHashCode 实现的一个原因。

更新
Eric Lippert has posted a blog提供有关 GetHashCode 的出色信息.

附加更新
我在上面做了一些更改:

  • 我区分了指南和规则。
  • 我击穿了“在对象的生命周期内”。

  • 指南只是指南,而不是规则。实际上,GetHashCode只有当对象需要遵循这些准则时才需要遵循这些准则,例如当它被存储在哈希表中时。如果您从不打算在哈希表(或任何其他依赖于 GetHashCode 的规则)中使用您的对象,则您的实现不需要遵循这些准则。

    当您看到“对象的生命周期”时,您应该阅读“对象需要与哈希表合作的时间”或类似内容。像大多数事情一样,GetHashCode是关于知道何时打破规则。

    关于c# - C# 中的 GetHashCode 指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/462451/

    相关文章:

    c# - CompiledQuery.Compile 需要锁(EF4、SQL Server、C#)

    c# - 如何确定一首歌曲使用了 winmm.dll 多长时间?

    .net - 测试驱动的 .NET 不会使用 NUnit 插件

    c# - 是否有任何好的 .Net 库用于构建任意 sql 命令?不是关系数据

    java - 有效 Java hashCode() 实现中的位移

    c# - 在加载时以编程方式更改 CSS 类?

    C# - 具有 new() 约束的泛型如何生成机器码?

    .net - 如果模块已导入到 Powershell 中,如何删除该模块?

    .net - IEqualityComparer<double> 带有容差;如何实现GetHashCode?

    java - 字符串 GUID 的哈希码为奇数或偶数的概率是多少?