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