具有不同属性的两个对象的hashvalue是相同的

时间:2016-06-01 05:40:27

标签: ios swift hash

考虑这个结构

==

我的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] 

1 个答案:

答案 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
}