使用するハッシュは、キーとして使用されるオブジェクトによって異なります。各クラスは独自の__hash __()メソッドを定義でき、特定のインスタンスに対して返される値は辞書に使用される値です。
Python自体は、str型とtuple型のハッシュ実装を提供します。ソースをすばやく見て、それらの正確なアルゴリズムを明らかにする必要があります。
タプルのハッシュは、その内容のハッシュに基づいています。文字列の
def hash(tuple):
mult = 1000003
x = 0x345678
for index, item in enumerate(tuple):
x = ((x^hash(item)) * mult) & (1<<32)
mult += (82520 + (len(tuple)-index)*2)
return x + 97531
、すべての文字を超える通訳も反復し、この(再び、少し簡略化)アルゴリズムと組み合わせる:
def hash(string):
x = string[0] << 7
for chr in string[1:]:
x = ((1000003 * x)^chr) & (1<<32)
return x
大きな問題アルゴリズムは、基本的にこの(やや簡素化)であります心配するには、ハッシュの衝突を避けることです。ハッシュキーが衝突すると、ディクショナリが新しいオブジェクトを格納する場所を見つけようとするときに線形検索が行われます(セキュリティ問題として認識されています)。
[Objects/dictnotes.txt](http://hg.python.org/cpython/file/2.7/Objects/dictnotes.txt) – jfs
[この質問を見てください](http://stackoverflow.com/questions/ 2070276/where-can-i-find-source-or-algorithm-of-pythons-hash-function)を参照してください。 [このページ](http://effbot.org/zone/python-hash.htm)へのリンクがあり、pythonがいくつかの異なるタイプをどのようにハッシュするかを説明しています。 – srgerg