1. ホーム
  2. パイソン

[解決済み】_hash__()の正しい実装方法と良い方法は?)

2022-04-11 23:04:15

質問

を実装する正しい方法、良い方法は何ですか? __hash__() ?

ハッシュコードを返す関数についてです。この関数は、ハッシュテーブル、別名ディクショナリにオブジェクトを挿入するために使用されます。

として __hash__() は整数を返し、オブジェクトをハッシュテーブルに "binning"するために使われます。私は、返された整数の値は、共通のデータに対して均一に分布するべきだと仮定します(衝突を最小化するため)。 そのような値を得るための良い方法は何ですか?衝突は問題ですか? 私の場合、いくつかのint、いくつかのfloatと文字列を保持するコンテナクラスとして機能する小さなクラスを持っています。

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

簡単で正しい実装方法 __hash__() は、キータプルを使用することです。特化したハッシュほど高速ではありませんが、それが必要ならCで型を実装するべきでしょう。

ハッシュと等号にキーを使用する例です。

class A:
    def __key(self):
        return (self.attr_a, self.attr_b, self.attr_c)

    def __hash__(self):
        return hash(self.__key())

    def __eq__(self, other):
        if isinstance(other, A):
            return self.__key() == other.__key()
        return NotImplemented

また のドキュメントは __hash__ にはより多くの情報があり、特定の状況下では価値があるかもしれません。