考虑一下这个结构

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
}

10-07 17:24