考虑这个结构
==
我的func ==(left: Node, right: Node) -> Bool {
return left.hashValue == right.hashValue
}
运营商
let node1 = Node(withValue: 1260, position: (8,694))
let node2 = Node(withValue: 33, position: (257,286))
当我创建2个节点时:
node1 == node2 //true ???
并比较它们:
hashValue
为什么(lldb) po node1.hashValue
4799450060528192039
(lldb) po node2.hashValue
4799450060528192039
功能无法正常工作?
是否应以某种不同的方式实施?
反问题:如果是,那么为这种对象计算hashValue的正确方法是什么?
更多信息
我调试时:
[mysqld]
答案 0 :(得分:3)
等哈希值不保证原始值相等。 hash collisions的整个概念仅仅因为这个原因而存在:
在计算机科学中, collision 或 clash 是当两个不同的数据具有相同的哈希值时发生的情况......
当一个非常大的集合(例如所有可能的人名或所有可能的计算机文件)的成员被映射到相对较短的位串时,冲突是不可避免的。
这意味着==
运算符的这种实现是错误的:
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
}