在Swift中编写一个好的Hashable实现

时间:2014-06-16 08:20:25

标签: hash swift

在Objective-C(和其他语言)中,- (NSUInteger)hash的相对较好的默认实现可能是:

- (NSUInteger)hash {
   return 31u * [self.property1 hash] + [self.property2 hash];
}

假设property1property2都为hash返回了良好的值。

这不适用于其var hashValue: Int协议中定义的Swift等效Hashable方法。

等效的Swift代码可能会溢出,这是Swift中的运行时错误。

var hashValue: Int {
    return 31 * property1.hashValue + property2.hashValue // overflow-tastic
}

所以我的问题是,在Swift中生成哈希值(实现Hashable)的最佳技术是什么?我应该使用XOR吗?虽然我的理解是XOR不是创建统一哈希分布的理想选择。也许是更具异国情调的东西?

1 个答案:

答案 0 :(得分:26)

正如Fabian Kreiser所建议的那样,可以使用溢出运算符来生成hashValue方法,如下所示:

var hashValue: Int {
    return (31 &* property1.hashValue) &+ property2.hashValue 
}

价值仍然溢出,但至少它没有崩溃