Hashcodes是一样的,但是!=返回true?

use*_*225 1 c# c#-4.0

我被一个看似简单的问题困扰了.我有两个对象,我正在与!=进行比较.

当我运行应用程序时,!= b是真的.当我放置一个断点并执行Watch时,a.GetHashCode()== b.GetHashCode()为true.

这两个(引用类型)对象在不同的​​程序集中定义,但我找不到对!=方法的覆盖(尽管重写了GetHashCode).还有另一种解释吗?两个对象的GetHashCode可能是相同的,但是not-overriden!=会返回true吗?

谢谢.

Ser*_*rvy 6

当两个不同的对象返回相同的代码时,它被称为"碰撞".只有大约40亿个可能的整数值,以及[你的类名在这里]超过40亿个可能的值,一些碰撞是不可避免的.这就是基于散列的结构(即Dictionary)不能完全依赖的原因GetHashCode,它还需要一个合理的Equals实现才能有效.该Equals方法用于解决这些冲突.

当然,这也有可能是类的创作者或者覆盖GetHashCode或Equals并以某种方式犯了一个错误,在某种程度上违反了生成散列码的"契约". 以下是创建GetHashCode方法时要记住的一条准则列表.请记住,您需要做的事情相当少,另外还有一些事情可以让它有效地发挥作用.

return 0;实际上是完全可以接受的GetHashCode实现.它符合所有规则,它只有100%的机会导致碰撞,所以它会非常低效,你不应该真的这样做.