提问人:Marcus Rossel 提问时间:9/4/2017 更新时间:9/5/2017 访问量:791
相等是否意味着相等的哈希值?
Should equality imply equal hash values?
问:
我目前正在研究一种图数据类型,在这种背景下,我思考了很多关于身份和平等的语义问题。
我现在的情况如下。我有一个类型: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
但这让我想到......
在语义上是否“不正确”(或者不合逻辑,如果你愿意的话),通过属性(如果符合)来确定哈希值。
在这种情况下,两个 s 可以始终具有相等的哈希值(不仅仅是对程序的一次调用),而不被认为是相等的。这似乎是不对的。value
T
Hashable
Vertex
因此,反过来说,实例的相等应该意味着其哈希值的相等是否明智?
答:
5赞
rmaddy
9/4/2017
#1
从文档中:Hashable
“由类型的 hashValue 属性提供的哈希值是一个整数,对于任何两个相等比较的实例都是相同的。也就是说,对于同一类型的两个实例 a 和 b,如果 a == b 则 a.hashValue == b.hashValue。反之则不然:两个具有相等哈希值的实例不一定彼此相等。
换言之,如果返回,则必须为两个对象返回相同的值。==
true
hashValue
2赞
Abizern
9/4/2017
#2
散列的要求是,如果两个值 和 相同,则 .然而,这并不意味着反之亦然。如果两个哈希值相同,则哈希项可能不相同。所以当你这么说时a
b
a.hashvalue == b.hashvalue
- “实例的相等应该意味着它们的哈希值相等吗?”这实际上是一个要求。
- “两个顶点可以始终如一地具有相等的哈希值(不仅仅是对程序的一次调用),而不会被认为是相等的。这似乎不对“——事实上这是可能的。
评论