我正在扩展一个符合
为了方便编写其他内容的哈希函数,我想扩展
Hashable
协议的struct
。我将使用DJB2哈希组合器来实现这一点。为了方便编写其他内容的哈希函数,我想扩展
Hashable
协议,使我的哈希函数可以像这样编写:extension MyStruct: Hashable {
public var hashValue: Int {
return property1.combineHash(with: property2).combineHash(with: property3)
}
}
但是当我尝试为 Hashable
编写扩展以实现`combineHash(with:)` 时,代码如下:
extension Hashable {
func combineHash(with hashableOther:Hashable) -> Int {
let ownHash = self.hashValue
let otherHash = hashableOther.hashValue
return (ownHash << 5) &+ ownHash &+ otherHash
}
}
...然后我收到了这个编译错误:
/Users/benjohn/Code/Nice/nice/nice/CombineHash.swift:12:43: 协议 'Hashable' 只能用作泛型约束,因为它具有 Self 或相关类型要求。
这是Swift不允许我这样做,还是我只是做错了,得到一个无用的错误消息?
另外提一句: JAL 的评论链接到一个由 Martin 写的 Swift 哈希函数的代码审查,Martin 在下面的被接受的答案中提供。在讨论中,他提到了另一种哈希组合器,它基于c++ boost库中的组合器。这个讨论确实值得一读。替代组合器在测试的数据上有更少的冲突。