我发现自己想要覆盖对象的hashcode和==,我想知道是否有实现依赖于多个属性的hashcode的最佳实践,而且似乎有一些特定于DART的注意事项.

最简单的答案是将所有属性的散列进行XOR运算,这可能并不太糟糕.在DART中也有一个以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位.

对于我的应用程序,集合的预期大小非常小,几乎任何东西都可以,但我很惊讶没有看到一个适用于一般情况的标准配方.有没有人有这方面的经验或强烈的经验?

推荐答案

quiver package提供了助手函数hash2hash3等,简化了实现hashCode的任务,并在一定程度上保证了它在编译为JavaScript时在Dart VM and下正常工作.

import 'package:quiver/core.dart';

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  bool operator ==(o) => o is Person && name == o.name && age == o.age;
  int get hashCode => hash2(name.hashCode, age.hashCode);
}

另请参阅this post,了解稍微长一点的讨论.

Dart相关问答推荐

我不明白在DART的`if()`语句中使用`case

Dart 列表中的 addAll() 和 followBy() 有什么区别?

dart 中的 Function() 和 Function 有什么区别?

Flutter - MultiProvider 如何与相同类型的提供者一起工作?

Task 'app:processDebugResources'的Flutter执行失败

从 Future 实例中获取值

Dart 1.8 中的异步/等待功能

如何使用Flutter dio 下载文件?

更改底片的灰色覆盖背景

dart中整数的最大值是多少?

在 Dart 中向服务器发出多个独立请求的最佳方式

使用Flatter向Cloud Firestore添加对象

常数在定义Flutter边缘集中的作用

Dart 有小部件库吗?

如何使用工厂构造函数扩展抽象类?

可选参数的默认值

列表的反向迭代器?

如何在 Dart 中逐个字符地迭代字符串?

你如何在 Dart 中创建一个 Stream?

在 Dart 中是否有一种将 int 转换为 double 的快速方法?