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
。然而,这并不意味着反之亦然。如果两个散列值相同,则散列项可能不相同。所以当你这么说的时候
- “实例的相等应该意味着它们的哈希值相等?”这实际上是一个要求
- “两个顶点可以有一致的相同散列值(不仅仅是一次程序调用),而不被认为是相等的。这似乎是不对的”-事实上这是可能的