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