C#HashSet定义了许多集合运算符,例如ExceptWith(...),它们需要将元素与另一个集合进行比较。这些方法是基于他们正在比较的对象的HashCode工作的,还是使用Equals()?
答案 0 :(得分:4)
与哈希码有关的任何内容应同时使用GetHashCode
和Equals
(无论是直接在候选值上调用还是通过IEqualityComparer<T>
调用它们)。
的散列码保证是唯一的:它们只是一个有效的初始过滤器。如果两个对象相等,则它们的哈希码必须相同......但仅仅因为哈希码相同并不意味着它们肯定是相等的。
哈希码用于非常快速地将大量可能的匹配缩小到具有相同哈希码的非常小的候选集合。 (哈希集会记住这些元素及其哈希码,因此可以检查哈希码,而无需每次重新计算它们。)然后必须使用Equals
检查每个候选项以确定它是否真的是匹配。
在HashTable
和Dictionary
中使用了相同的逻辑,尽管可能在实现方面存在细微差别。 (Wikipedia article on hash tables列出了几种变体。)