Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有不同属性的两个对象的哈希值相同_Ios_Swift_Hash - Fatal编程技术网

Ios 具有不同属性的两个对象的哈希值相同

Ios 具有不同属性的两个对象的哈希值相同,ios,swift,hash,Ios,Swift,Hash,考虑一下这个结构 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)".

考虑一下这个结构

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
 }
}
我的
==
操作员

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

相等的散列值并不保证原始值相等。整个概念的存在正是因为这个原因:

在计算机科学中,冲突或冲突是两个不同数据段具有相同哈希值时发生的情况

当一个非常大的集合(例如所有可能的人名或所有可能的计算机文件)的成员映射到一个相对较短的位字符串时,冲突是不可避免的

这意味着
==
运算符的此实现是错误的:

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
}

相等的散列值并不保证原始值相等。整个概念的存在正是因为这个原因:

在计算机科学中,冲突或冲突是两个不同数据段具有相同哈希值时发生的情况

当一个非常大的集合(例如所有可能的人名或所有可能的计算机文件)的成员映射到一个相对较短的位字符串时,冲突是不可避免的

这意味着
==
运算符的此实现是错误的:

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
}

您的init方法在哪里?抱歉,忘记复制:D已添加!您的init方法在哪里?抱歉,忘记复制:D已添加!