【发布时间】:2011-09-12 09:59:20
【问题描述】:
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 方法将使用哈希码字段作为优化,然后再比较其他字段值。如果哈希码不同,我们可以确定其余字段也不同。无论是在哈希表中使用,还是仅在相等比较中使用,这都有效。 GetHashCode 返回预先计算的哈希码字段。如果某些字段也是不可变对象,则可以向下扩展许多级别并加快比较速度。
-
+1 提出一个好问题。这是关于 SO 上
GetHashCode主题的无限相似问题的一个很好的变体。
标签: .net performance equals gethashcode