2016-10-28 17 views
3

特定の文字列のハッシュ値はCPython2.7でどのように計算されますか?例えば文字列のPython hash()関数

、このコード:

print hash('abcde' * 1000) 

は、私はPythonのプロセスを再起動し、(私はそれを何回もやった)に再度お試した後も同じ値を返します。

文字列のid()(メモリアドレス)はこの計算に使用されていないようですね。それではどうですか?

+2

「私はPythonのプロセスを再起動して、もう一度お試した後も同じ値を返します」 - Python 3では当てはまりません。 "この計算では文字列のid()(メモリアドレス)が使用されていないようです" - もちろん、そうではありません。さもなければ、 'a == b'は' hash(a)== hash(b) 'を意味する不変式を持たないでしょう。 – user2357112

+0

あなたは 'help(hash)'と 'help(id)'を実行する必要があると思います。なぜなら、それらの違いは同じではないからです... –

+1

多分このスレッドはいくつかの光を放つでしょうか? http://stackoverflow.com/questions/6008026/how-hash-is-implemented-in-python-3-2 – BorrajaX

答えて

8

ハッシュ値は、メモリの場所に依存するのではなく、オブジェクト自体の内容に依存します。 documentationから:

(存在する場合)オブジェクトのハッシュ値を返します。ハッシュ値は整数です。辞書検索中に辞書キーをすばやく比較するために使用されます。等しいかどうかを比較する数値は、同じハッシュ値を持ちます(1と1.0の場合と同じですが、異なる型の場合でも同じです)。

あなたはここにstrクラスのhash方法のCPythonの実装のためのソースコードをチェックアウトすることができます:

https://svn.python.org/projects/python/trunk/Objects/stringobject.c

+0

ありがとうございます。だから、それはハッシュ(文字列)は、実行するために、右から実行される同じだろうか? –

+4

@ d-dいいえ、毎回同じであることは保証されていませんが、同じプロセス内で同じ値を返すことが保証されています。変更しないハッシュを使用する場合は、代わりに[hashlib](https://docs.python.org/3/library/hashlib.html)関数を使用してください。 – Selcuk

+0

ええ、私はそれについて考えましたが、私はこのモジュールのどのハッシュ関数よりも速いものが必要です。雑音ハッシュかそうであるかもしれません。 –

関連する問題