Swift 从哈希值计算中省略属性
有没有一种方法可以使用Swift 从哈希值计算中省略属性,swift,Swift,有没有一种方法可以使用hash(into:)来计算结构/类的hashvalue,同时省略某些属性 i、 e 我希望这能奏效: 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)) let cache=Set() 让ite
hash(into:)
来计算结构/类的hashvalue,同时省略某些属性
i、 e
我希望这能奏效:
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))
let cache=Set()
让item1=CacheItem(val1:0,val2:0)
让item2=CacheItem(val1:0,val2:0)
cache.insert(item1)
断言(cache.contains(item2))
但是,它不起作用。一个
集合是一个独特对象的集合,相等性是基于与=
的比较。相等的对象必须具有相同的哈希值,但不是相反:不同的对象可以具有相同的哈希值。(一个简单的例子:有264个可能的散列值,但无限多的字符串。因此,必须有具有相同散列值的不同字符串。)
可散列集合(如Set
和Dictionary
)在其实现中使用散列值(例如,将不同的对象放入不同的“bucket”),但它们从不单独使用散列值来确定相等性
==
的默认实现比较所有(存储的)属性是否相等。因此,在您的情况下,如果item1
和item2
具有相同的val1
和val2
但不同的date
,则它们是不同的对象,即使它们具有相同的哈希值
如果您希望将具有相同val1
和val2
但不同date
的对象视为相等,则必须自己实现=
:
struct CacheItem: Codable, Hashable {
// ...
static func ==(lhs: CacheItem, rhs: CacheItem) -> Bool {
return lhs.val1 == rhs.val1 && lhs.val2 == rhs.val2
}
}
然后
var cache=Set()
让item1=CacheItem(val1:0,val2:0)
让item2=CacheItem(val1:0,val2:0)
cache.insert(item1)
打印(缓存包含(项目2))
将始终打印true
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))