2017-08-26 11 views

答えて

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

私はlinked-hash-mapがこれの事実上の箱であると信じています。

関連する問題