小编典典

C#中的GetHashCode准则

c#

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

即使特定对象的数据发生了变化,GetHashCode()在特定对象的整个生命周期内的返回值也应保持恒定(相同的值)。在许多情况下,您应该缓存方法return以强制执行此操作。

这是有效的指南吗?

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


阅读 717

收藏
2020-05-19

共1个答案

小编典典

答案大部分是,这是有效的准则,但可能不是有效的规则。它也不能说明全部故事。

需要说明的是,对于可变类型,您不能将哈希码基于可变数据,因为两个相等的对象必须返回相同的哈希码,并且哈希码在对象的生存期内必须有效。如果哈希码发生更改,最终将导致对象丢失在哈希集合中,因为该对象不再存在于正确的哈希容器中。

例如,对象A返回哈希1。因此,它进入哈希表的bin 1。然后,更改对象A,使其返回2的哈希值。当哈希表查找它时,它将在bin 2中查找并且找不到它-
该对象在bin 1中是孤立的。这就是为什么哈希码必须 在对象的整个生命周期中都 不会改变,而编写GetHashCode实现的原因之一就是痛苦。

更新
Eric Lippert发布​​了一个博客该博客提供了有关的出色信息GetHashCode

其他更新
我在上面做了几处更改:

  1. 我对准则和规则进行了区分。
  2. 我打通了“对象的生命周期”。

指导方针只是指导,不是规则。实际上,GetHashCode只有在事物期望对象遵循准则时(例如将其存储在哈希表中时),才必须遵循这些准则。如果您从不打算在哈希表中使用对象(或任何其他依赖的规则GetHashCode),则您的实现无需遵循准则。

当看到“对象的生存期”时,应阅读“对象需要与哈希表协作的时间”或类似内容。像大多数事情一样,GetHashCode是要知道何时违反规则。

2020-05-19