【问题标题】:Should equality imply equal hash values?相等应该意味着相等的哈希值吗?
【发布时间】:2018-02-12 20:36:31
【问题描述】:

我目前正在研究一种图形数据类型,在这种情况下,我对有关身份和平等的语义问题进行了很多思考。

我现在的情况如下。我有一个Vertex 类型:

final class Vertex<T>: Hashable {

  static func ==(lhs: Vertex, rhs: Vertex) -> Bool { 
    return lhs === rhs
  }

  var value: T

  var hashValue: Int { 
    return ObjectIdentifier(self).hashValue 
  }

}

如您所见,平等是由身份决定的。我这样做是出于特定于图形数据类型的原因,但它基本上归结为一个事实,即顶点应该通过它们的身份来查看,因此只有在它们相同时才被视为相等(相同) 顶点。

现在哈希值也由身份确定(使用ObjectIdentifier)。这似乎是获取哈希值的最简单方法,而且似乎与这种类型的相等概念非常吻合。

但这让我开始思考......
假设通过value 属性(如果T 符合Hashable)来确定哈希值在语义上是否“不正确”(或者不合逻辑)。
在这种情况下,两个Vertexs 可以始终具有相等的哈希值(不仅仅是对程序的一次调用),而不会被视为相等。这似乎不对。

那么反过来:说实例的相等性应该意味着它们的哈希值相等是否明智?

【问题讨论】:

    标签: swift hash identity equality semantics


    【解决方案1】:

    散列的要求是,如果ab 两个值相同,则a.hashvalue == b.hashvalue。然而,这并不意味着反之亦然。如果两个散列值相同,则散列项可能不相同。所以当你这么说的时候

    • “实例的相等性应该意味着它们的哈希值相等吗?”这实际上是一个要求。
    • “两个顶点可以始终具有相等的哈希值(不仅仅是一次调用程序),而不被认为是相等的。这似乎不对” - 事实上这是可能的。

    【讨论】:

      【解决方案2】:

      来自Hashable 的文档:

      "由类型的hashValue属性提供的哈希值是一个整数,对于任何两个同等比较的实例来说都是相同的。也就是说,对于相同类型的两个实例a和b,如果a == b那么a.hashValue == b.hashValue。反之则不然:哈希值相等的两个实例不一定彼此相等。"

      换句话说,如果== 返回truehashValue 必须为两个对象返回相同的值。

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 2011-08-14
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-08-25
        • 2013-02-03
        • 1970-01-01
        相关资源
        最近更新 更多