gpt4 book ai didi

swift - 一组可散列的自定义元素插入相等的元素

转载 作者:行者123 更新时间:2023-12-05 09:25:51 28 4
gpt4 key购买 nike

设置:

我想使用以下结构Set:

struct NumberPair: Hashable {
let n1: Int
let n2: Int

static func == (lhs: NumberPair, rhs: NumberPair) -> Bool {
lhs.n1 == rhs.n1 && lhs.n2 == rhs.n2 ||
lhs.n2 == rhs.n1 && lhs.n1 == rhs.n2
}

func hash(into hasher: inout Hasher) {
hasher.combine(n1)
hasher.combine(n2)
}
}

我预计将 2 个相等的元素(根据上面定义的函数)插入到一个空的 Set 中会得到一个只有一个元素的 Set:

    var pairs: Set<NumberPair> = []
//…
pairs.insert(NumberPair(n1: 1, n2: 2))
pairs.insert(NumberPair(n1: 2, n2: 1))

问题:

但是,在第二次插入时出现运行时错误

Fatal error: Duplicate elements of type 'NumberPair' were found in a Set.
This usually means either that the type violates Hashable's requirements, or
that members of such a set were mutated after insertion.

当我在static func == 中设置断点时,这个断点没有命中。

问题:

为什么我的自定义相等函数没有被调用,如何正确调用?

最佳答案

您的hash() 方法违反了Hashable 最重要的要求协议(protocol):

Two instances that are equal must feed the same values to Hasher in hash(into:), in the same order.

例子:

let p1 = NumberPair(n1: 1, n2: 2)
let p2 = NumberPair(n1: 2, n2: 1)

print(p1 == p2) // true
print(p1.hashValue) // -386759992433315259
print(p2.hashValue) // -5091661336101841357

这里 p1p2 是“相等的”但产生不同的哈希值。

hash 方法的实现方式必须使其在 n1n2 交换时产生相同的结果,例如

func hash(into hasher: inout Hasher) {
hasher.combine(min(n1, n2))
hasher.combine(max(n1, n2))
}

func hash(into hasher: inout Hasher) {
hasher.combine(n1 ^ n2)
}

备注:第二个更简单,也许更快,但更可能导致哈希冲突。 struct Hasher 及其 combine(_:) 方法在 Swift 4.2 中引入(以及其他原因)以摆脱“XOR 哈希”,参见 SE-0206 SEHashable Enhancements .

关于swift - 一组可散列的自定义元素插入相等的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74993234/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com