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已添加!