2017-12-23 45 views
-3

と異なっている、それは同じ整数を返す.__ハッシュ__(Iは整数でハッシュ方式を使用していたとき)の動作は、整数と文字列

>>> s=1 
>>> s.__hash__() 
1 

しかし、私は文字列とハッシュ方式を使用してそれは多くの数字

>>> s="String" 
>>> s[0].__hash__() 
-942210382 
>>> s.__hash__() 
-985060378 
を返します。

どのように動作しますか、ハッシュ値の生成方法

+2

Pythonでは、ほとんどの小さな 'int'が自分自身にハッシュしてしまいますが、明らかに文字列ではできません。ここで驚くべきものは何ですか?あなたの質問は何ですか? –

+0

*「どのように」*あなたはどういう意味ですか?これはインタプリタレベルの実装の詳細です。 CPythonの動作は他の動作と異なる場合があります。例えば、 https://docs.python.org/3/library/functions.html#hash、https://docs.python.org/3/reference/datamodel.html#object.__hash__ – jonrsharpe

+1

私はハッシュ値が記憶場所であるかもしれないと感じます。文字列とタプルはハッシュ可能であり、listとdictはハッシュ可能ではありません。ハッシュ値は何ですか? – Artier

答えて

3

ハッシュ値は、指定されたデータから派生した値です。ユニークなデータのユニークな値を提供することが期待される方法で計算されますが、データ自体のビット数よりもはるかに少ないビットが含まれることが多いため、保証されません。

ハッシュ値は任意の数にすることができます。あなたがランダム化装置から得るかもしれない__hash__()から任意の値を得ることができると仮定してください。

どうやら整数自身の値が一意に識別するための整数のハッシュ値は、単純そのものであるので、あなたは、文字列のハッシュ値が基づいている値である1

から1を取得します文字列内のすべての文字を含む計算。したがって、それはあまり予測できず、非常にしばしば非常に大きく、おそらくは負になることがあります。それはちょうどそれが行く方法です。

s[0]は概念的には文字列の最初の文字ですが、それはsとは異なり、値は異なりますが異なる文字列を取得する理由です。

+1

あまり、 'hash(-1)'を試してください。 –

+0

@Chris_Rands - 明らかにそうです。 -1はなぜ特別なのですか? –

+0

ああ、明らかに内部C関数から-1を返すことはエラーを投げることを意味するので、C実装のハッシュ関数は-1を返さないようにハッキングされます。クレイジー。 –

2

__hash__関数は、整数値を返すように定義される:組み込み関数のハッシュによって呼び出さ

()とセット、のfrozensetを含む ハッシュコレクションのメンバーで操作するため、およびdict.__hash__() を返すべき整数。唯一必要なプロパティは、equalを比較するオブジェクト が同じハッシュ値を持つことです。

Python Documentation

整数自体を一意に独自の値によって識別されます。文字列を何らかの形で(可能な限り)一意の整数に変換する必要があります。

関連する問題