考虑一下这个结构
struct Node : Hashable {
let value : Int
let i : Int
let j : Int
init(withValue val : Int, position : (Int,Int)){
value = val
self.i = position.0
self.j = position.1
}
var hashValue: Int {
return "\(value),\(i),\(j)".hashValue
}
}
My
==
操作员func ==(left: Node, right: Node) -> Bool {
return left.hashValue == right.hashValue
}
当我创建2个节点时:
let node1 = Node(withValue: 1260, position: (8,694))
let node2 = Node(withValue: 33, position: (257,286))
并进行比较:
node1 == node2 //true ???
为什么
hashValue
函数没有按预期工作?是否应该以不同的方式实施?
反问题:如果是,那么计算此类对象的hashValue的正确方法是什么?
更多信息
当我调试这个时:
(lldb) po node1.hashValue
4799450060528192039
(lldb) po node2.hashValue
4799450060528192039
最佳答案
相等的哈希值不能保证原始值相等。“AA>”的整个概念正是因为这个原因才存在的:
在计算机科学中,当两个不同的数据片段具有相同的散列值时,就会发生冲突或冲突。。。
当一个非常大的集合(例如所有可能的人名或所有可能的计算机文件)的成员映射到一个相对较短的位字符串时,冲突是不可避免的。
这意味着==
运算符的实现是错误的:
func ==(left: Node, right: Node) -> Bool {
return left.hashValue == right.hashValue
}
相反,它应该是:
func ==(left: Node, right: Node) -> Bool {
return left.value == right.value
&& left.i == right.i
&& left.j == right.j
}