2011-08-22 29 views
11

unordered_mapのハッシュ関数を特殊化して、int配列をキーとして使用できるようにする必要があります。配列の値は通常0または1です。 int array = {0, 1, 0, 1}ですが、技術的には制限はありません。int配列のC++ハッシュ関数

この場合、良いハッシュ関数をお勧めしますか?代わりに、私は常にint配列を文字列に変換し、特殊化を避けることができます。しかし、私はこれらのアレイが数百万個もあるかもしれないので、パフォーマンスについて懸念しています。

+2

ブーストの「範囲ハッシュ」を使用するか、模倣します。これは、 'hash_combine'を繰り返し呼び出すことによって構築されています。これはBoostにもあり、本当に標準になっているはずです。 –

+0

これらの配列が数百万ある場合、私は新しいアルゴリズム/データ構造を提案します。 – Blindy

+0

@Blindyどのようなデータ構造をお勧めしますか? – gewizz

答えて

6

C++ TR1には、ハッシュテンプレート関数が含まれています。

まだ持っていない場合は、「ブーストハッシュ」を使用できます。

便利なヘルパーのためのアイデア:

size_t seed = 0; 
for (const T* it=arr; it!=(arr+N); ++it) 
    boost::hash_combine(seed, *it); 
return seed; 

に相当

#include <boost/functional/hash.hpp> 

template <typename T, int N> 
    static std::size_t hasharray(const T (&arr)[N]) 
{ 
    return boost::hash_range(arr, arr+N); 
} 

これは(?大体)だろうが、あなたがこれを使用している場合は、適切な等価比較操作を実装することを忘れないでください検索用ハッシュ

+0

'std :: size_t 'は、可能な限り大きな配列のサイズを表すことが保証されているので、' std :: size_t N'でなければならないと思います。さらに、署名付きのタイプである必要はありません。 – outofthecave

+0

@outofthecave fair points。しかし、unsignedは伝染性があり、オフセットには扱いにくい(負の値になる可能性があり、 'N-10'は' N <10'ならばラップアラウンドします。また、配列は231より大きな要素で静的に型付けされていますか?それらはまれです。あなたがそれらを持っていれば、あなたはしばしばそれらをハッシュしていないだろう。 – sehe

5

ハッシュ関数lookup8を試してみてください。この機能は非常に高速かつ良好です。

int key[100]; 
int key_size=10; 
for (int i=0;i<key_size;i++) key[i]=i; //fill key with sample data 
ub8 hash=hash((ub8*)key, sizeof(key[0])*key_size, 0); 
+0

これはC++ではありません。 – Puppy

+9

通常、ハッシュ関数はプレーンで書かれています。 C++ラッパーを作成することができます。 – vromanov

+2

通常、ハッシュ関数は*手元の言語で書かれています。 – Puppy