1. ホーム
  2. dart

Dartでhashcodeをオーバーライドするための良いレシピは何ですか?

2023-09-26 23:51:22

質問

私は、オブジェクトのハッシュコードと==をオーバーライドしたいと思うのですが、複数の属性に依存するハッシュコードを実装する方法についてベストプラクティスがあるのかどうか疑問に思っています。

最も単純な答えは、すべての属性のハッシュを一緒に XOR することで、おそらくそれほど悪くはないでしょう。また、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ビットに切り詰めます。

私のアプリケーションでは、セットの予想サイズは非常に小さく、ほとんど何でもうまくいきますが、一般的なケースの標準レシピを見ないことに驚いています。どなたか、これに関する経験または強い経験をお持ちの方はいらっしゃいますか?

どのように解決するのですか?

この 震える パッケージ ヘルパー関数を提供する hash2 , hash3 などの実装を簡略化することができます。 hashCode を実装する作業を簡素化し、Dart VM の下で適切に動作することをある程度保証します。 で正常に動作することが保証されています。

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);
}

また この記事 を参照してください。