答えて
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. 辞書オブジェクトからキーを取得しますか?
- 5. 辞書のキーから値を取得する方法
- 6. sklearn辞書学習のエラー計算
- 7. 辞書リストのキー名の再マッピング
- 8. 辞書からの位置によるキー値の取得
- 9. 辞書の無効なキー
- 10. 辞書のキー
- 11. python辞書キー
- 12. 値からキーを取得 - 辞書<string、List <string>>
- 13. ネストされた辞書から親キーを取得
- 14. 辞書の値の頻度を計算する
- 15. 辞書のキーの中で配列の長さを取得する
- 16. Python:キーのポインタで辞書の値を取得または設定する
- 17. 辞書で特定の値のリストからキーを取得する
- 18. モデルクエリから辞書を取得する
- 19. タプルの辞書のタプルの最大コンポーネントへのキーの取得
- 20. 辞書でキーをソートする?
- 21. Python:追加された順に辞書キーを取得しますか?
- 22. タブipythonで完全な辞書キー
- 23. グループディクショナリ辞書キー(C#)
- 24. NSDictionaryからキーのオブジェクトを取得するには?名前の辞書に
- 25. 値を取得するための辞書のループ固有のキー
- 26. クライアントデータセットで計算フィールドと内部計算フィールドを再計算する方法
- 27. 辞書キーをCFDictionaryGetValueに渡します。
- 28. 再計算大きなテーブル
- 29. ExcelDnaでExcel計算モードを取得
- 30. python 3クリーナーコード、辞書から値を計算
あなたが何を求めているのか分かりません。ハッシュとキーは等価ではありません - ハッシュは衝突することができますが、キーは衝突できません。あなたがハッシュの内部を調べて各エントリを調べることができれば、それは実装に依存すると思いますが、これはCPythonにはありません –
'for my_dict:print hash(key)'おそらく... –
@JoranBeasley技術的には、これらのハッシュを再計算することもできます( '__hash__'実装はハッシュをキャッシュすることができますが、保証されません) –