答案大部分是,这是有效的准则,但可能不是有效的规则。它也不能说明全部故事。
需要说明的是,对于可变类型,您不能将哈希码基于可变数据,因为两个相等的对象必须返回相同的哈希码,并且哈希码在对象的生存期内必须有效。如果哈希码发生更改,最终将导致对象丢失在哈希集合中,因为该对象不再存在于正确的哈希容器中。
例如,对象A返回哈希1。因此,它进入哈希表的bin 1。然后,更改对象A,使其返回2的哈希值。当哈希表查找它时,它将在bin 2中查找并且找不到它-
该对象在bin 1中是孤立的。这就是为什么哈希码必须 在对象的整个生命周期中都 不会改变,而编写GetHashCode实现的原因之一就是痛苦。
更新
Eric Lippert发布了一个博客,该博客提供了有关的出色信息
GetHashCode。
其他更新
我在上面做了几处更改:
- 我对准则和规则进行了区分。
- 我打通了“对象的生命周期”。
指导方针只是指导,不是规则。实际上,
GetHashCode只有在事物期望对象遵循准则时(例如将其存储在哈希表中时),才必须遵循这些准则。如果您从不打算在哈希表中使用对象(或任何其他依赖的规则
GetHashCode),则您的实现无需遵循准则。
当看到“对象的生存期”时,应阅读“对象需要与哈希表协作的时间”或类似内容。像大多数事情一样,
GetHashCode是要知道何时违反规则。



