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

Swift 相等是否意味着哈希值相等?,swift,hash,identity,equality,semantics,Swift,Hash,Identity,Equality,Semantics,我目前正在研究一种图形数据类型,在这种情况下,我思考了很多关于身份和平等的语义问题 我现在的情况如下。我有一个顶点类型: final class Vertex<T>: Hashable { static func ==(lhs: Vertex, rhs: Vertex) -> Bool { return lhs === rhs } var value: T var hashValue: Int { return ObjectIdenti

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

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

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 
  }

}
最终类顶点:可散列{
静态函数==(左:顶点,右:顶点)->Bool{
返回lhs===rhs
}
var值:T
var hashValue:Int{
返回ObjectIdentifier(self).hashValue
}
}
正如你所见,平等是由身份决定的。我之所以这样做是因为特定于图形数据类型的原因,但它基本上归结为这样一个事实,即顶点应该通过它们的标识来查看,因此只有当它们是相同(相同)的顶点时才被视为相等

现在,哈希值也由标识确定(使用
ObjectIdentifier
)。这似乎是获取散列值的最简单方法,而且似乎与此类型的相等概念非常一致

但这让我想到……
通过
value
属性(如果
T
符合
Hashable
)来确定散列值在语义上是否“不正确”(或不合逻辑,如果您愿意)。
在这种情况下,两个
Vertex
s可以一致地具有相等的散列值(不仅仅是对于程序的一次调用),而不被视为相等。这似乎是不对的


那么反过来说:说实例的相等应该意味着它们的散列值相等,这明智吗?

来自
Hashable
的文档:

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


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

来自
Hashable
的文档:

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


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

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

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

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

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