【发布时间】:2014-01-01 21:03:18
【问题描述】:
我发现自己想为一个对象覆盖哈希码和 ==,我想知道是否有最佳实践来实现依赖于多个属性的哈希码,而且似乎有一些特定于 Dart 的注意事项.
最简单的答案是对所有属性的哈希值进行异或运算,这可能还不错。 Dart Up and Running 中还有一个示例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 位。
对于我的应用程序,集合的预期大小非常小,几乎任何事情都可以,但我很惊讶没有看到针对一般情况的标准配方。有没有人有这方面的经验或经验丰富?
【问题讨论】:
-
我说“食谱”几乎是-1,但是由于您的问题质量很好,所以我没有-1。当然,您应该在标题中使用的术语是算法,甚至是“方法”(例如,一种好的方法或一种好的算法),而不是“一个好的食谱”。如果您认为“算法”一词听起来像是在炫耀,我可以理解。你可以说“方式”,但使用“食谱”这个词是蹩脚的
-
也许可以从另一种语言中寻找具有任意精度整数的示例。我相信 Smalltalk 有这些。
-
Dart 的整数很有趣,因为它们在 VM 上是任意的,但如果你编译成 JavaScript,你就会得到 Javascript 的限制。所以你想要截断,有趣的问题是在哪里以及如何做到最好。大概是移位/乘法、异或和截断的某种组合。这也是 Smalltalk 倾向于做的事情。魔鬼在细节中。