.net - 为什么使用 GetHashCode() 而不是 Equals()?

标签 .net performance equals gethashcode

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/

相关文章:

java - EasyMock - 改变 equals() 和其他对象方法的行为

c# - 如何以编程方式检索 Excel 工作表中的页数?

c# - 使用c#在连续纸上打印

javascript - 有什么比 setTimeout 和 requestAnimationFrame 更快的吗?

c# - Parallel.For() 会随着重复执行而变慢。我应该看什么?

css - 如何使 Joomla 主要内容和模块列动态匹配高度?

.net - 什么是 ".Net Identity"?

c# - 图像打印的宽高比不正确?

.net - GMAP.Net 是否有谷歌地图限制,每天有 1500 个查询?

python - 矩阵求逆 (3,3) python - 硬编码与 numpy.linalg.inv