【问题标题】:Do the HashSet set operators work based on GetHashCode() or Equals()?HashSet 集合运算符是否基于 GetHashCode() 或 Equals() 工作?
【发布时间】:2013-05-01 20:27:51
【问题描述】:

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

【问题讨论】:

  • 两者都有!对象首先通过哈希码进行比较,然后通过Equals()(如果哈希码匹配)进行比较。
  • 只使用GetHashCode 显然会被破坏。 GetHashCode 有(实际的)冲突。如果您使用较大的加密哈希(例如 SHA-256)而不是低质量的 32 位哈希,则依赖哈希相等是可以的。

标签: c# hashset


【解决方案1】:

任何与哈希码有关的都应同时使用GetHashCodeEquals(无论是直接在候选值上调用它们还是通过IEqualityComparer<T> 调用)。

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

哈希码用于非常快速地将大量可能的匹配项缩小到具有相同哈希码的非常小的候选集。 (哈希集记住了元素和它们的哈希码,因此可以检查哈希码而无需每次都重新计算它们。)然后必须依次检查每个候选者Equals 以确定它是否真的 一场比赛。

HashTableDictionary 使用相同的逻辑,尽管在实现上可能存在细微差别。 (Wikipedia article on hash tables 列出了几个变体。)

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 2012-06-03
    • 2017-01-09
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多