我发现自己想覆盖对象的哈希码和==,我想知道是否有最佳实践来实现依赖于多个属性的哈希码,而且似乎存在一些Dart特定的注意事项。
最简单的答案是将所有属性的哈希值进行XOR运算,这可能还不错。在https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html
的“飞镖启动并运行”中还有一个示例 // Override hashCode using strategy from Effective Java, Chapter 11.
int get hashCode {
int result = 17;
result = 37 * result + firstName.hashCode;
result = 37 * result + lastName.hashCode;
return result;
}
但是似乎它期望截断整数语义,并且在Dart中溢出JS整数范围似乎对哈希不利。
我们也可以这样做,并且每次操作后都将其截断为32位。
对于我的应用程序,该集合的预期大小非常小,几乎可以执行任何操作,但是令我惊讶的是,没有看到适用于一般情况的标准配方。是否有人对此有任何经验或丰富经验?
String.hashCode()
处存在一个开放的bug,并且提供了此错误,并且引用的“ Jenkins SMI哈希”似乎是最好的选择,如果它可以公开获得。