1. ホーム
  2. python

[解決済み] Pythonで良い_hash__関数を実装する方法 [重複].

2022-09-05 15:21:13

質問

複数のプロパティを持つクラスを実装する場合(下のおもちゃの例のように)、ハッシュを処理する最良の方法は何ですか?

と推測します。 __eq____hash__ は一貫しているはずですが、すべてのプロパティを扱える適切なハッシュ関数を実装するにはどうしたらよいでしょうか。

class AClass:
  def __init__(self):
      self.a = None
      self.b = None

  def __eq__(self, other):
      return other and self.a == other.a and self.b == other.b

  def __ne__(self, other):
    return not self.__eq__(other)

  def __hash__(self):
      return hash((self.a, self.b))

私は この質問 でタプルがハッシュ可能であることを読んだので、私は上記の例のようなものが賢明であるかどうか疑問に思っていました。それはそうですか?

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

__hash__ は、等しいオブジェクトに対して同じ値を返すべきです。また、オブジェクトの寿命が尽きるまで変化してはいけません。一般的には、immutableなオブジェクトに対してのみ実装します。

些細な実装としては、単に return 0 . これは常に正しいのですが、パフォーマンスが悪いです。

あなたの解決策、プロパティのタプルのハッシュを返すことは、良いことです。しかし、比較するすべてのプロパティを __eq__ で比較するすべてのプロパティをタプルにリストアップする必要はないことに注意してください。あるプロパティが通常、不等間隔のオブジェクトに対して同じ値を持つなら、それを省けばいい。ハッシュの計算を必要以上に高価にしないようにしましょう。

編集:私は一般的にハッシュを混合するためにxorを使用しないことをお勧めします。2 つの異なるプロパティが同じ値を持つ場合、それらは同じハッシュを持つことになり、xor を使用するとこれらは互いに相殺されます。タプルはハッシュを混合するために、より複雑な計算を使用します。 tuplehash tupleobject.c .