答えて
Pythonの辞書オブジェクトには、オブジェクトが保存されているハッシュを見ることができる公開APIはありません。 Pythonコードでオブジェクトをハッシュで直接格納することはできません(CPythonの内部C関数を呼び出すことで可能です)。キーではなく、ハッシュ値で辞書に値を追加できない理由はいくつかあります。
最も明白なことは、複数のキーオブジェクトが同じハッシュを持つ可能性があることです。このようなハッシュの衝突が発生した場合、2番目の値がハッシュテーブルのどこかに挿入されます。重要なことは、同じ値をハッシュする別のキーの下に格納されていた以前の値を上書きしないことです。ハッシュでもキーでもない場合、Pythonは同じキーを使用しているかどうか、または衝突したハッシュを持つ新しいキーを提供しているかどうかを知ることができません。
ハッシュで挿入できない第2の理由は、セキュリティ上の脆弱性であるということです。ハッシュの衝突が少ない場合、Pythonの辞書などのハッシュテーブルのパフォーマンスは非常に優れています。しかし、すべてのハッシュが同じであれば、非常に悪いです。すべて同じ値にハッシュしたPythonプログラムにデータを提出できれば、非常に効率的なサービス拒否攻撃を行うことができます(最近のバージョンのPythonでは、この種の攻撃を困難にするために新しいハッシュランダム化が追加されました)。
まあ、これを返すカスタム' __hash__'メソッドを用意することで、値と内容にかかわらず、単純に比較結果が異なります –
これを正確に実行します:ハッシュ - > datadump(値または値のリスト)を提供することによってdictを照会します。 Dictオブジェクトのイントロスペクション –
A Pythonのdict
のキー、すなわち、__hash__
特別な方法(並びに質問に無関係ないくつかの他の方法)を実装し、hashableこと、またはいくつかの所定のタイプに内蔵のものでなければなりません。だから、実際に
>>> '123'.__hash__()
163512108404620371
かによって、例えばテーブル、なしでキーのハッシュ値にアクセスすることができ、より均一に
>>> hash('123')
163512108404620371
>>> hash(2)
2
コメント、ハッシュ値とで述べたように、言われていることテーブル内の位置は同じではありません。実際、テーブルのサイズが変更されると、キーのハッシュ値は同じままですが、位置は変更される可能性があります。その結果、として:
ハッシュ値が
hash()
を経由してあなたに容易に入手可能である位置は、辞書の内部状態を公開します
簡単にあなたのオブジェクト内のハッシュ値を「キャッシュ」することができます
__hash__
の方法では十分です
キーが公開されていない可能性があります'ポジション。
メソッドに直接行くのではなく、 'hash()'組み込み関数を使うこともできます。 – zondo
ありがとう、@ zondo - 私はすでにそれを更新しましたが、私はコメントに感謝します。 –
@ zondoしかし、OPの動機づけはハッシュ値の再計算を避けることでしたので、このメソッドについて言及することは重要でした。私の主張は、 '__hash__'メソッド内にキャッシュできるということでした。 –
- 1. 辞書キーの合計を計算する
- 2. 辞書のキーなしで値を取得するには?
- 3. 辞書のキーを取得する
- 4. python:辞書のキーを取得する
- 5. 辞書をソートしてキーを取得するだけです
- 6. リスト/辞書のキーを取得
- 7. 辞書キーで注文された辞書要素のリストを取得する
- 8. Python:辞書の値を計算する
- 9. 辞書でキーをソートして特定のキーから値を取得する
- 10. インスタンスである辞書キーを取得する
- 11. Python辞書で非排他的な値の集計合計を計算する
- 12. IPythonで辞書を表示すると、ハッシュが再計算されます
- 13. Pythonの辞書でキーとしてRID ODはNaNを取得
- 14. キーによる辞書の集計値
- 15. 配列を合計して辞書で掛け算する
- 16. JavaScriptによる辞書から値をキーで取得
- 17. 辞書オブジェクトからキーを取得しますか?
- 18. キーを押したときに計算値を再計算する方法は?
- 19. 辞書のキーを比較して値を加算する -
- 20. 辞書(python)から最高のキーを取得するには?
- 21. Python辞書の値に基づいてキーを取得する
- 22. 値の辞書からキーを取得する配列
- 23. 辞書のキーから値を取得する方法
- 24. 辞書のリストからキー値を取得する
- 25. 辞書スウィフトから辞書を取得
- 26. すべて同じ 'key [0]'を取得し、その値を辞書で計算する方法
- 27. フライでネストされた辞書を作成して集計を計算する
- 28. 辞書を再帰的にルーピングしてキーを削除する
- 29. Python辞書。同じキーの合計値
- 30. pythonマルチ辞書でキーを使用して値を取得する方法
あなたが何を求めているのか分かりません。ハッシュとキーは等価ではありません - ハッシュは衝突することができますが、キーは衝突できません。あなたがハッシュの内部を調べて各エントリを調べることができれば、それは実装に依存すると思いますが、これはCPythonにはありません –
'for my_dict:print hash(key)'おそらく... –
@JoranBeasley技術的には、これらのハッシュを再計算することもできます( '__hash__'実装はハッシュをキャッシュすることができますが、保証されません) –