在Dart中重写哈希码的好方法是什么?

问题描述 投票:24回答:4

我发现自己想覆盖对象的哈希码和==,我想知道是否有最佳实践来实现依赖于多个属性的哈希码,而且似乎存在一些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位。

对于我的应用程序,该集合的预期大小非常小,几乎可以执行任何操作,但是令我惊讶的是,没有看到适用于一般情况的标准配方。是否有人对此有任何经验或丰富经验?

dart hashcode
4个回答
29
投票
quiver package提供了辅助函数hash2hash3等,这些函数简化了实现hashCode的任务,并保证了在编译为JavaScript时在Dart VM

and


1
投票
由于Dart与Java非常相似,因此您肯定可以在适用于Dart的Java hashCodes上找到良好的引用。

1
投票
虽然这不是一个很好的答案,但在String.hashCode()处存在一个开放的bug,并且提供了此错误,并且引用的“ Jenkins SMI哈希”似乎是最好的选择,如果它可以公开获得。

© www.soinside.com 2019 - 2024. All rights reserved.