2009-06-05 13 views
2

私は数多くの異なるアイテムを数える必要があります。私のようなペアのリスト処理している:私は何を計画していた何特殊なハッシュテーブルC++

A34223,34 
B23423,-23 
23423212,16 

することは、第1の値(キー)ハッシュだったし、 'スパース構造の鍵となる32ビット整数に値 'が加算され(すべてゼロから始まる)、負の数になります。

キーが短く英数字であることを考えると、32ビットx86アーキテクチャ上で高速なハッシュアルゴリズムを生成する方法はありますか?それとも、既存の適切なハッシュがありますか?

ハッシュの設計についてはわかりませんが、単純な入力のために、指定されたキー長の「X」の衝突がないことを保証する高性能ハッシュを生成する方法があることを期待していました。高分散であるため、長さが「X」を超えると衝突が最小限に抑えられます。

答えて

8

C++を使用しているときは、最初に行うべきことは、std :: mapを使用して簡単なインプリメンテーションを作成することです。それは十分に速いですか?もしそうなら、それに固執してください。そうでなければ、C++の実装がハッシュテーブルを提供しているかどうか調べてください。そうであれば、それを使って簡単な実装を作成し、テストし、時間を計る。それは十分に速いですか(ほとんど確かにそうです)?

これらのオプションを使い果たしてしまった後で、独自のハッシュテーブルとハッシュ関数を実装する必要があります。

+0

ありがとうございました。あなたが正しい。私は最初に些細なことを試みるべきです。ハッシング・ピースは、プログラムの中で別個の機能であり、合理的にはOKのパフォーマンスが得られます。これがランタイムに33%以上を追加しない限り、私はOKでなければなりません。 –

1

衝突のないことの保証は困難です。あなたのケースでは

、キー

A34223 
B23423 
23423212 

は、少ない労力で32ビット整数に変換することができます。良いハッシュ関数のための

/** 
* "The Practice of Programming", Hash Tables, section 2.9, pg. 57 
* 
* computes hash value of string 
*/ 
DWORD 
strhash(char* str) 
{ 
    //#define MULTIPLIER 31 or 37 
    unsigned int h; 
    unsigned char* p; 

    h = 0; 
    for (p=(unsigned char*)str; *p != '\0'; p++) 
    h = 31 * h + *p; // <- FIXED MULTIPLIER 

    return h; 
} 
1

チェックBob Jenkin's website:ここ

とは、文字列からハッシュ値を生成する優れた機能です。 IIRCはPerlで使用されているのと同じハッシュです。