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 可以一致地具有相等的哈希值(不仅仅是程序的一次调用),而不被视为相等。这似乎不对。
那么反过来:说实例相等应该意味着它们的哈希值相等是否明智?
从文档中Hashable:
\n\n\n“由 type\xe2\x80\x99s hashValue 属性提供的哈希值是一个整数,对于同等比较的任何两个实例而言,该值都相同。也就是说,对于同一类型的两个实例 a 和 b,如果 a = = b 那么 a.hashValue == b.hashValue。反之则不然:具有相等哈希值的两个实例不一定彼此相等。”
\n
换句话说,如果==return true,则hashValue必须为两个对象返回相同的值。
| 归档时间: |
|
| 查看次数: |
867 次 |
| 最近记录: |