2011-11-05 10 views
5

2つの配列があります。char data1 [length] lengthは8の倍数です。つまり、長さは8,16,24 ...のいずれかです。バイナリモードで開いています。私はファイルから読み続けるつもりで、読み込んだ値をハッシュテーブルに格納します。このバイナリデータの乱れはランダムな分布を持つ。私は各配列をハッシュし、特定のデータを持つcharを再度検索できるようにするためにハッシュテーブルに格納したいと思います。このタスクを達成するための良いハッシュ関数は何でしょうか。ありがとうランダムなバイナリ文字列をハッシュするための適切なハッシング関数

私はこれをC++とCで書いていることに注意してください。あなたが解決策を提供するために選択した言語はすばらしいでしょう。

+0

* Berkeley DB4 *を使用して、そのライブラリですべての詳細を処理させてみませんか? –

+0

ハッシュの衝突についてはどうしますか? –

答えて

3

あなたが読み取られたデータは、8バイト長と本当にランダムに分布しており、あなたのハッシュコードは32ビットで、どのようなこの程度にする必要がある場合:あなたはもっとスピードが必要な場合は

uint32_t hashcode(const unsigned char *data) { 
    uint32_t hash = 0; 
    hash ^= get_uint32_le(data + 0); 
    hash ^= get_uint32_le(data + 4); 
    return hash; 
} 

uint32_t get_uint32_le(const unsigned char *data) { 
    uint32_t value = 0; 
    value |= data[0] << 0; 
    value |= data[1] << 8; 
    value |= data[2] << 16; 
    value |= data[3] << 24; 
    return value; 
} 

、このコードはおそらく作らことができますdataが常にconst uint32_t *と解釈されるように正しく整列されていることを保証できる場合は、より高速に処理できます。

+0

質問に記載されているように、長さは8の倍数の数値です。あなたの考えを8バイトだけでなく8の倍数にまで拡張するにはどうすればよいですか? –

+0

hashcode関数に 'size_t datalen'パラメータを追加します。あなたがコードを理解したら、これは簡単なことです。私はそれを簡単に拡張できるようにコードを書いた。 –

+2

+1:データが本当にランダムであれば(ここでは「統一」という意味です)、xorにする必要はありません。最初の32ビットをハッシュとして使用してください。 –

2

私は自分のプロジェクトで成功裏にMurmurHash3を使用しました。

長所:

  • それは速いです。 非常に速い
  • おそらく衝突率は低いです。

短所:

  • それは、暗号化アプリケーションに適していないのです。
  • これはどんな形や形でも標準化されていません。
  • x86以外のプラットフォームには移植できません。しかし、本当に必要な場合には移植できるはずです。Javaに移植することはできましたが、これはほとんど同じことではありません。

などです。高速ハッシュテーブルの実装...

+0

私は私のプロジェクトで実装したい、実際に私はMurmurHash経由でバイナリに文字列をハッシュしたい。しかし、Murmurハッシュアルゴリズムは、負のハッシュ値も生成します。だから私は問題に直面している。上記のコードと同じコードを実装します。 それと同様のメッセージのために類似したハッシュ値を与えると、任意のハッシュアルゴリズムがあります。たとえば、ある文字に変更がある場合にのみ、ハッシュ値の変更が少なくなります。 –

関連する問題