HashSet<T>.Add
首先比较GetHashCode
的结果.如果它们相等,则调用 Equals
.
现在,我的理解是为了实现 GetHashCode
,必须对对象的字段进行一些处理。一个简单的示例实现可以在 What is the best algorithm for an overridden System.Object.GetHashCode? 找到。 .
在我的测试中,比较了 1.000.000 对充满随机数据的对象,两者的性能或多或少相等。 GetHashCode
按照链接示例中的方式实现,Equals
只需调用Equals
在所有领域。那么为什么要使用 GetHashCode
超过 Equals
?
最佳答案
对于某些类型,Equals
测试可能相对昂贵。它通常必须比较类的每个字段。换句话说,类的大小需要线性时间。较大的类(class)比较平等的成本更高。
现在,如果您需要将一个对象与 1000 个其他对象进行比较,会发生什么?调用Equals
1000 倍可能会变得昂贵。如果 N 是类的大小,您需要进行 N*2000 字段访问GetHashCode
而是根据类的内容生成一个“大部分唯一的”整数。换句话说,类字段被访问一次。一旦你有了它,你就可以将这个整数与构成其他对象哈希码的 1000 个整数进行比较。
即使在这样一个幼稚的用例中,我们现在也只需要 N*1000 个字段访问。
但是如果我们存储哈希码呢?当我们将一个对象插入一个散列集时,它的散列码被计算一次。现在,任何时候我们想在散列集中进行查找,我们只需要计算一个散列码(外部对象的散列码),然后你只需要比较简单的整数。
所以 N 类字段访问(对于我们需要计算其哈希码的新对象),加上一些整数比较,这些比较取决于算法,但 1)相对较少,2)便宜。
关于.net - 为什么使用 GetHashCode() 而不是 Equals()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305324/