web-dev-qa-db-ja.com

Pythonの辞書マッピングはどのハッシュアルゴリズムを使用しますか?

私はコマンドラインパーサーを作成することをいじっていて、どのようなハッシュアルゴリズムpython dictの使用ですか?

私の設定方法では、トークン化された入力シーケンスを辞書キーと照合するパターン照合アルゴリズムがあります。一部のキーは比較的長いです(6〜7文字の文字列の長さ5または6タプル)。長い辞書キーがキー検索の効率を大幅に低下させるポイントがあるのではないかと思いました。

33
Joel Cornett

使用するハッシュは、キーとして使用されているオブジェクトによって異なります。各クラスは独自の__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

心配すべきより大きな問題は、ハッシュの衝突を回避することです。ハッシュキーが衝突すると、辞書が新しいオブジェクトを格納する場所を見つけようとするため、線形検索が発生します(これは現在セキュリティの問題として認識されており、今後のpythonバージョン)

33
Ian Clelland