2013-05-01 94 views
1

C#HashSet定义了许多集合运算符,如ExceptWith(...),它们需要将元素与另一个集合进行比较。这些方法是基于它们正在比较的对象的HashCode工作,还是使用Equals()?HashSet集合运算符是否基于GetHashCode()或Equals()工作?

+2

两个!对象首先通过哈希码进行比较,然后通过Equals()进行比较(如果哈希码匹配)。 – dlev 2013-05-01 20:29:18

+0

只有使用'GetHashCode'明显会被破坏。 'GetHashCode'有(实际)冲突。如果使用大型加密哈希(如SHA-256)而不是低质量32位哈希,则依靠哈希等式是很好的。 – CodesInChaos 2013-05-01 20:30:15

回答

4

任何做散列码应同时使用GetHashCodeEquals(无论是通过直接调用他们的候选值或通过IEqualityComparer<T>)。

哈希码是而不是保证是唯一的:它们只是一个初始过滤器,有效。如果两个对象相等,那么它们的散列码必须是相同的......但仅仅因为散列码相同并不意味着它们绝对相等。

哈希码用于非常快速地将一大组可能的匹配缩小到具有相同哈希码的非常小的候选集。 (哈希集记录元素及其哈希码,这样哈希码可以在不重新计算它们的情况下被检查)。然后每个候选者必须依次检查Equals以确定它是否真的是的匹配。

HashTableDictionary中使用相同的逻辑,尽管可能在实现方面存在细微的差异。 (该Wikipedia article on hash tables列出了几个变化。)