2011-01-16 25 views
1

私は15の符号なしlong型を持つデータ構造を持って、私は次のようにhash_combineを使用してハッシュ関数を定義していますboost :: unordered_mapの使用時にキー衝突を数えるには?

friend std::size_t hash_value(const TUPLE15& given) 
    { 
     std::size_t seed = 0; 

     boost::hash_combine(seed, val1); 
     boost::hash_combine(seed, val2); 
     ... 
     return seed; 
    } 

私はブーストに多数の値を挿入:: unordered_mapが、性能は十分ではありません。おそらく、私は別のハッシュ関数を使ってうまくいくかもしれません。これを確認するには、私が何回衝突しているかを確認する必要があります。これはどうすればいいですか?

答えて

1

タプルの数と一意のハッシュ値の数を比較するとどうですか?

set<size_t> hash_values; 
BOOST_FOREACH(const TUPLE15& tuple, tuples) 
    hash_values.insert(hash_value(tuple)); 
size_t collisions = tuple_map.size() - hash_values.size(); 

または

size_t collisions = 0; 
for (size_t bucket = 0; bucket != tuples.bucket_count(); ++bucket) 
    if (tuples.bucket_size(bucket) > 1) 
     collisions += tuples.bucket_size(bucket) - 1; 
+0

衝突の実際の数とは対照的に、あなたの2番目の例では、衝突を含むバケットの数をカウントし... '衝突+ = tuples.bucket_size(バケット)に変更し-1 ; '? – gospes

+0

@gospes:そうです、今修正しました。ありがとうございました。 –

関連する問題