2016-03-23 19 views
2

私はordered_mapを作成し、以下の要素同じバケットに異なるハッシュコードを持つキー。 C++

私はバケツをチェックすると、私は7つのバケツがあったことが判明し挿入しました。

これは私が読んだものです。
un_orderedの関連コンテナの要素はバケットに編成されています。同じハッシュコードを持つキーは同じバケットに表示されます

しかし、私はキーのハッシュコードを印刷したとき、異なるハッシュコードを持つバケットに要素があることがわかりました。

#include <iostream> 
#include <string> 
#include <unordered_map> 
int main() 
{ 
    typedef std::unordered_multimap<std::string,std::string> stringMap; 
    stringMap mymap; 
    mymap.insert({ 
      {"house","maison"}, 
      {"apple","pomme"}, 
      {"tree","arbre"}, 
      {"book","livre"}, 
      {"door","porte"}, 
      {"grapefruit","pamplemousse"}, 
      }); 

    unsigned n = mymap.bucket_count(); 
    unsigned s = mymap.size(); 

    std::cout << "mymap has " << n << " buckets.\n"; 
    std::cout << "mymap size " << s << " keys.\n"; 

    stringMap::hasher fn = mymap.hash_function(); 

    for (unsigned i=0; i<n; ++i) 
    { 
    std::cout << "bucket #" << i << " contains: " << std::endl;; 
    for (auto it = mymap.begin(i); it!=mymap.end(i); ++it) 
    { 
     std::cout << "[" << it->first << ":" << it->second << "] "; 
     std::cout << "KEY HASH VALUE: " << fn (it->first) << std::endl; 
    } 

    std::cout << "\n"; 
    } 

    return 0; 
} 

何かが不足していて、なぜ要素が異なるハッシュコードを持ち、同じバケットに存在するかを教えてください。

結果:正常なのです

mymap has 7 buckets. 
mymap size 6 keys. 
bucket #0 contains: 
[book:livre] KEY HASH VALUE: 4190142187 
[house:maison] KEY HASH VALUE: 4227651036 

bucket #1 contains: 

bucket #2 contains: 

bucket #3 contains: 
[grapefruit:pamplemousse] KEY HASH VALUE: 3375607049 
[tree:arbre] KEY HASH VALUE: 335777326 

bucket #4 contains: 

bucket #5 contains: 
[apple:pomme] KEY HASH VALUE: 2758877147 

bucket #6 contains: 
[door:porte] KEY HASH VALUE: 3658195372 

おかげ

+0

*「同じバケットに同じハッシュコードを持つキーが表示されます」*「!=」***異なる***ハッシュコードを持つキーは、***異なるバケットに表示されます。 –

答えて

1

。 32ビットのハッシュコードを使用している場合、2^32バケットは必要ありません。代わりに、ハッシュコードはバケットのインデックスにマップされます。たとえば、7つのバケットがある場合、項目はバケット#(ハッシュ%7)を使用することがあります。したがって、0,7,14,21、...などのハッシュコードを持つアイテムはすべて同じバケットに表示されます。

関連する問題