GetHashCode()具有很特殊的要求:相等的对象必须产生相等的散列值,并且散列值必须是对象不变的,并且是均衡的高效分布。所有这些只有对恒定类型才能满足。
这句话摘自:Effective C#中。
关于gethashcode方法,重写时应该遵守以上三个准则。我看了下,要想同时做到准确和高效是很难的。
准则一和二要求,产生的散列值依赖于对象,无论对象的属性等如何变化,只要它还是这个对象,他所产生的散列值就应该是一样。effective中对于值类型,产生散列值时推荐依赖于对象的不变对象(readonly等),纵然这样,也只能保证相同的对象生成相同的散列值(我还不敢完全确定),想要保证不同的对象生成不同的散列值似乎这样是是不可能的(虽然我没有找到有这样的明确要求,但我认为这样是必要的)。
总而言之,重写实现gethashcode是一件很麻烦的事情,只能做到对一个特定的范围来说是有效地吧。