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);
}
また この記事 を参照してください。
関連
-
[解決済み] 文字列のための優れたハッシュ関数
-
[解決済み] JavaでequalsとhashCodeをオーバーライドする際に考慮すべき事項は?
-
[解決済み】コレクションのhashCodeメソッドの最適な実装について
-
[解決済み】ダーツのダブルドット(.)の使い方をリストアップしてみる?
-
[解決済み】_hash__()の正しい実装方法と良い方法は?)
-
[解決済み] Dartのasyncとasync*の違いは何ですか?
-
[解決済み] hashCodeは何に使うのですか?ユニークですか?
-
[解決済み] ステートレスウィジェットクラスのKeyとは何ですか?
-
[解決済み] Flutter でプログラム的にモードなボトムシートを閉じる
-
[解決済み] Dartで他のファイルを参照するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Java の String の hashCode() では、なぜ 31 が乗数として使われるのですか?
-
[解決済み】Dartで日付をフォーマットする方法とは?
-
[解決済み] InitStateメソッドで非同期データをロードする方法はありますか?
-
[解決済み] ローカルフラッターパッケージを別のフラッターアプリケーションで使用するには?
-
[解決済み] Flutter でプログラム的にモードなボトムシートを閉じる
-
[解決済み] Flutterでのテキストフィールドの検証
-
[解決済み] FlutterアプリにJSONアセットを読み込むには?
-
配列に値が存在するか確認する Flutter dart
-
リストを平坦化するには?
-
AppBarを透明化し、画面全体に設定された背景画像を表示させる