在Objective-C(和其他语言)中,- (NSUInteger)hash
的相对较好的默认实现可能是:
- (NSUInteger)hash {
return 31u * [self.property1 hash] + [self.property2 hash];
}
假设property1
和property2
都为hash
返回了良好的值。
这不适用于其var hashValue: Int
协议中定义的Swift等效Hashable
方法。
等效的Swift代码可能会溢出,这是Swift中的运行时错误。
var hashValue: Int {
return 31 * property1.hashValue + property2.hashValue // overflow-tastic
}
所以我的问题是,在Swift中生成哈希值(实现Hashable)的最佳技术是什么?我应该使用XOR吗?虽然我的理解是XOR不是创建统一哈希分布的理想选择。也许是更具异国情调的东西?
答案 0 :(得分:26)
正如Fabian Kreiser所建议的那样,可以使用溢出运算符来生成hashValue方法,如下所示:
var hashValue: Int {
return (31 &* property1.hashValue) &+ property2.hashValue
}
价值仍然溢出,但至少它没有崩溃