は私のコードです:オブジェクトを適切にハッシュ可能にするにはどうすればいいですか?ここ
class Hero:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return self.name + str(self.age)
def __hash__(self):
print(hash(str(self)))
return hash(str(self))
heroes = set()
heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 1
heroes.add(Hero('Lara Miheenko', 17)) # gets hash -2822451113328084695
print(len(heroes)) # gets 2
heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 3! WHY?
なぜこの出来事はありますか?
第1と第3のオブジェクトは同じ内容と同じハッシュを持っていますが、len()
は約3つの固有のオブジェクトを示していますか?
わからないですが、あなたはおそらく '__eq__'または' __cmp__'を必要として:http://docs.python.org/glossary.html#term-hashable – nhahtdh
これは別のところ、これは最良のハッシュ関数ではありません(一般的な文字列をハッシングしていないため、文字列要素の1つがはるかに低いエントロピー数字で構成されていることが分かっているため)。簡単ではあるがかなり効果的な修正をするには、オブジェクトのハッシュ値を別々にとり、それらをxorします。より多くの魔法の場合は、素数定数でスケーリングしたものを追加します。 –
@ KonradRudolph:あなたのコメントには暗黙の前提があります。具体的には、セットがうまくいくためには「良い」ハッシュが必要です。これは、Pythonの 'set'実装では当てはまりません。詳しくは、[Pythonのソースからのこのコメント](http://hg.python.org/cpython/file/26e2ee402a0b/Objects/dictobject.c#l113)を参照してください。 –