特定の文字列のハッシュ値はCPython2.7でどのように計算されますか?例えば文字列のPython hash()関数
、このコード:
print hash('abcde' * 1000)
は、私はPythonのプロセスを再起動し、(私はそれを何回もやった)に再度お試した後も同じ値を返します。
文字列のid()
(メモリアドレス)はこの計算に使用されていないようですね。それではどうですか?
特定の文字列のハッシュ値はCPython2.7でどのように計算されますか?例えば文字列のPython hash()関数
、このコード:
print hash('abcde' * 1000)
は、私はPythonのプロセスを再起動し、(私はそれを何回もやった)に再度お試した後も同じ値を返します。
文字列のid()
(メモリアドレス)はこの計算に使用されていないようですね。それではどうですか?
ハッシュ値は、メモリの場所に依存するのではなく、オブジェクト自体の内容に依存します。 documentationから:
(存在する場合)オブジェクトのハッシュ値を返します。ハッシュ値は整数です。辞書検索中に辞書キーをすばやく比較するために使用されます。等しいかどうかを比較する数値は、同じハッシュ値を持ちます(1と1.0の場合と同じですが、異なる型の場合でも同じです)。
あなたはここにstr
クラスのhash
方法のCPythonの実装のためのソースコードをチェックアウトすることができます:
https://svn.python.org/projects/python/trunk/Objects/stringobject.c
ありがとうございます。だから、それはハッシュ(文字列)は、実行するために、右から実行される同じだろうか? –
@ d-dいいえ、毎回同じであることは保証されていませんが、同じプロセス内で同じ値を返すことが保証されています。変更しないハッシュを使用する場合は、代わりに[hashlib](https://docs.python.org/3/library/hashlib.html)関数を使用してください。 – Selcuk
ええ、私はそれについて考えましたが、私はこのモジュールのどのハッシュ関数よりも速いものが必要です。雑音ハッシュかそうであるかもしれません。 –
「私はPythonのプロセスを再起動して、もう一度お試した後も同じ値を返します」 - Python 3では当てはまりません。 "この計算では文字列のid()(メモリアドレス)が使用されていないようです" - もちろん、そうではありません。さもなければ、 'a == b'は' hash(a)== hash(b) 'を意味する不変式を持たないでしょう。 – user2357112
あなたは 'help(hash)'と 'help(id)'を実行する必要があると思います。なぜなら、それらの違いは同じではないからです... –
多分このスレッドはいくつかの光を放つでしょうか? http://stackoverflow.com/questions/6008026/how-hash-is-implemented-in-python-3-2 – BorrajaX