2011-04-15 5 views
1
size_t hash(const std::string data) { 
    size_t h(0); 
    for (int i=0; i<data.length(); i++){ 
     h = (h << (31-i)^(h >> i)^data[i]); 
    } 
    h = h%hashsize; 
    return h; 
} 
+0

これはバグだと思います。 「31」とsize_tが一緒に使用されているのは、混在させようとしていた方法をミックスしていない可能性が高いことを示しています。 – ohmantics

+0

それは、鉛筆や紙の仕事がたくさん必要になるでしょう。関数呼び出しのコンテキストは何ですか? – pjwilliams

+0

これはネットのどこかで見つけられ、この 'h =(h <<(31-i)^(h >> i)^ data [i])を理解していません。 ' – Vijay

答えて

3

それは、TR1のために表向き適しstd::stringのハッシュ関数、およびC++ 11のstd::unordered_map<>std::unordered_set<>などすなわちそれに使用するための所与std::string用として一意-AS-可能size_t値を作成しようとしハッシュテーブル

言われているように、それは貧弱なハッシュ関数です。 unordered_map<>unordered_set<>などに付属する標準ライブラリの実装には、これよりも優れた実装を持つ標準ライブラリ文字列のためのハッシュ関数が組み込まれています。

EDIT:Bitwise operation(応答してコメントへ)<<>>は、ビット単位の右シフトであり、^を簡単このWikipediaの項目に記載されているすべてがビット単位のXORである、左ビット単位のシフトです。

+0

あなたは何を言っているのですか?その文字列のためのユニークな符号なし整数を作成することです!私はそうですか? – Vijay

+1

@ゾンビ:一意ではなく、一意である可能性があります - 32/64ビットの記憶域(ほとんどのプラットフォーム)で与えられたそれぞれに対して、一意の整数を生成するには多すぎる文字列値があります。しかし、はい、それがアイデアです。 – ildjarn

関連する問題