【发布时间】:2018-02-12 20:36:31
【问题描述】:
我目前正在研究一种图形数据类型,在这种情况下,我对有关身份和平等的语义问题进行了很多思考。
我现在的情况如下。我有一个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)。这似乎是获取哈希值的最简单方法,而且似乎与这种类型的相等概念非常吻合。
但这让我开始思考......
假设通过value 属性(如果T 符合Hashable)来确定哈希值在语义上是否“不正确”(或者不合逻辑)。
在这种情况下,两个Vertexs 可以始终具有相等的哈希值(不仅仅是对程序的一次调用),而不会被视为相等。这似乎不对。
那么反过来:说实例的相等性应该意味着它们的哈希值相等是否明智?
【问题讨论】:
标签: swift hash identity equality semantics