相等是否意味着哈希值相等?

Mar*_*sel 2 hash identity equality semantics swift

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

我现在的情况如下。我有一个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 
  }

}
Run Code Online (Sandbox Code Playgroud)

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

现在哈希值也由身份确定(使用ObjectIdentifier)。这似乎是获取哈希值的最简单方法,并且似乎也与这种类型的相等概念很好地一致。

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

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

rma*_*ddy 5

从文档中Hashable

\n\n
\n

“由 type\xe2\x80\x99s hashValue 属性提供的哈希值是一个整数,对于同等比较的任何两个实例而言,该值都相同。也就是说,对于同一类型的两个实例 a 和 b,如果 a = = b 那么 a.hashValue == b.hashValue。反之则不然:具有相等哈希值的两个实例不一定彼此相等。”

\n
\n\n

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

\n