gpt4 book ai didi

swift - 从哈希值计算中省略一个属性

转载 作者:行者123 更新时间:2023-12-04 02:33:43 34 4
gpt4 key购买 nike

有没有一种方法可以使用 hash(into:) 来计算结构/类的哈希值,同时忽略某些不使用的属性?

struct CacheItem: Codable, Hashable {
let val1: Int
let val2: Int
let date: Date = Date()

func hash(into hasher: inout Hasher) {
hasher.combine(val1) // leave out date for computing hash value
hasher.combine(val2)
}
}

我希望这会起作用:

let cache = Set<CacheItem>()
let item1 = CacheItem(val1: 0, val2: 0)
let item2 = CacheItem(val1: 0, val2: 0)

cache.insert(item1)
assert(cache.contains(item2))

然而,它并没有奏效。

最佳答案

Set 是唯一对象的集合,相等性基于与== 的比较。相等的对象必须具有相同的哈希值,但反之则不然:不同的对象可以具有相同的哈希值。 (一个简单的例子:有 264 种可能的哈希值,但是有无限多的字符串。因此必然存在具有相同哈希值的不同字符串。)

可哈希集合(如 SetDictionary)在其实现中使用哈希值(例如,将不同的对象放入不同的“桶”),但它们从不使用哈希值单独来确定相等性。

== 的默认实现比较所有(存储的)属性是否相等。因此,在您的情况下,如果 item1item2 具有相同的 val1val2 但不同的 date 那么它们就是不同的对象,即使它们具有相同的哈希值。

如果您希望具有相同 val1val2 但不同 date 的对象被认为是相等的,那么您必须实现 == 你自己:

struct CacheItem: Codable, Hashable {
// ...

static func ==(lhs: CacheItem, rhs: CacheItem) -> Bool {
return lhs.val1 == rhs.val1 && lhs.val2 == rhs.val2
}
}

然后

var cache = Set<CacheItem>()
let item1 = CacheItem(val1: 0, val2: 0)
let item2 = CacheItem(val1: 0, val2: 0)

cache.insert(item1)
print(cache.contains(item2))

将始终打印true

关于swift - 从哈希值计算中省略一个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62829127/

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