HashMap
は、次のプログラム開始時に同じデータであっても要素の順序が異なります。 HashMap
は、要素をソートするためにいくつかの絶対アドレスを使用しているようです。他のHashMap
実装がありますか?同じデータが挿入された場合、同じ動作をしますか?プログラム実行の間に一貫した順序付けを持つHashMap実装がありますか?
3
A
答えて
4
HashMap
は、次回のプログラム開始時に同じデータであっても要素の順序が異なります。
あなたはに何を観察していない、これはdocumented by HashMap
です:デフォルトでは
、
HashMap
はHashDoS攻撃に対する耐性を提供するように選択ハッシュアルゴリズムを使用しています。アルゴリズムはランダムにシードされ、プログラムをブロックせずにホストによって提供される高品質で安全な乱数源からこのシードを生成するための妥当なベストエフォートが作られます。
これは同じプログラムの実行で挿入された値の同じセットを持つ2つのHashMap
sがそう異なる順序を持っていることを意味していることは注目に値します:
use std::collections::HashMap;
fn main() {
let a = (0..100).zip(100..200);
let hash_one: HashMap<_, _> = a.clone().collect();
let hash_two: HashMap<_, _> = a.clone().collect();
// prints "false", most of the time
println!("{}", hash_one.into_iter().eq(hash_two));
}
ドキュメントはまたどのようにわかりますハッシュアルゴリズムはdefault
、を使用してパーHashMap
的に交換することができます
:問題を解決しますおよび
with_capacity_and_hasher
の方法が挙げられる。 fnv crateなど、多くの代替アルゴリズムがcrates.ioで利用できます。
私はtwox-hashで働いていたので、私は、一例として、あることを示します:言われていること
use std::hash::BuildHasherDefault;
use std::collections::HashMap;
use twox_hash::XxHash;
let mut hash: HashMap<_, _, BuildHasherDefault<XxHash>> = Default::default();
hash.insert(42, "the answer");
assert_eq!(hash.get(&42), Some(&"the answer"));
、悪いアイデアのようなHashMap
音の順序に依存します。おそらく、BTreeMap
のような別のデータ構造を使用する必要があります。
実際には、の挿入の順番に注意してください。そのためにはordermap crateが適切です。
1
HashMap::with_hasher()
には、デフォルトのRandomState
以外を使用してください。
1
私はlinked-hash-mapがこれの事実上の箱であると信じています。
関連する問題
- 1. Kotlinで異なる値の型を持つHashmapを実装する
- 2. 単一の値につながる複数のキーを持つHashMap
- 3. Javaに一貫性のある(単調な)クロック実装がありますか?
- 4. 複数の値を持つキーを持つHashMap
- 5. Javaで2つのスレッドを持つHashMapのキーを印刷しますか?
- 6. 順序付けられたテストの実行後にレンズリフレクトテストを実行しないのはなぜですか?
- 7. 2つのフィールドを持つHashMapを並べ替える
- 8. の実行順序
- 9. 順列を持つ演算を実装するC++クラスはありますか?
- 10. コードから順序付けられたテストを実行する方法
- 11. ゴルーチン実行順序
- 12. 実行順序bahaviour
- 13. Google App Engine:順序付きリストのコレクションを実装する
- 14. xcode 8がUIテストケースを実行する順序はありますか?
- 15. 実行ループ内での実行順序
- 16. C#メソッドオーバーロードパラメータの順序付け規則はありますか?
- 17. いくつかのDrupalモジュールがMODULENAME_template_preprocessを実装するとき、実行される順序は何ですか?
- 18. async実行順序が間違っています
- 19. 文字列キーを持つHashMapは実際にTrieよりも時間の複雑さが低いですか?
- 20. Androidプログラムの実行にはどのような手順がありますか?
- 21. 2つのリストをPrologで順序付けしました
- 22. bashスクリプトの実行順序
- 23. Javascriptのキーイベント実行順序
- 24. javascriptの実行順序
- 25. jsf f:eventsの実行順序
- 26. クロージャの実行順序
- 27. Javaアノテーションの実行順序
- 28. Verilogの実行順序
- 29. Javascriptの実行順序は、()
- 30. Javascriptコードの実行順序
たとえば...? –