web-dev-qa-db-ja.com

Cの最小ハッシュ関数?

Boost:hashは使用できません。Cに固執しなければならず、C++を使用できないからです。

ただし、トークン文字列(長さ5から40バイト)を大量(10Kから100k)ハッシュして、それらのトークン内での検索が最速になるようにする必要があります。

MD5、SHA1、または任意の長いハッシュ関数は、単純なタスクには重すぎるようです。暗号化は行っていません。さらに、ストレージとコンピューティングのコストがかかります。

したがって、私の質問:

  1. ほとんどの実際のケースで衝突防止を保証する最も単純なハッシュアルゴリズムは何でしょうか。

  2. ハッシュ値に使用するビット数は? 32ビットシステム用に開発しています。 Perl/Pythonのハッシュアルゴリズムも32ビットハッシュを使用しますか?または、64にジャンプする必要がありますか?

  3. 一般的なスクリプト言語でのハッシュテーブルの実装について:実装は衝突をチェックしますか、それともその部分を完全に回避できますか?

40
CDR

http://www.azillionmonkeys.com/qed/hash.html で、優れた(そして高速な)ハッシュ関数と興味深い読み物を見つけることができます。

衝突をチェックしてはいけないのは、完璧なハッシュ- gperf のような古き良きルックアップテーブルを使用する場合だけです。

23
gnud
  1. ここ は、最も有名な既知のハッシュ関数の素晴らしい概要です。

  2. 32ビットは問題なく動作するはずです。

  3. 面白いハッシュテーブルを書きたくない限り、衝突を常にチェックする必要があります:)

11
arul

ハッシュテーブルルックアップ の一般的なハッシュ関数。 暗号化の目的には使用しないでくださいが、その意図がないと指定したので、大丈夫です。

含まれているのはハッシュ関数の調査試してみる

8
TStamper

Posixに似たシステムを使用していて、プレーンなCに固執している場合は、システムが既に提供しているものを使用します。 man 3 hcreateはすべての詳細を提供するか、ここでオンラインバージョンを見つけることができます http://linux.die.net/man/3/hcreate

5
amo-ej1

長い文字列には Adler32 を、短い文字列には Murmur2 を試してください。

2
Dru G

xxhash は非常に高速で簡単なオプションです。簡単なコードはXXH32関数を使用します:

unsigned int XXH32 (const void* input, int len, unsigned int seed);

32ビットハッシュです。 lenintであるため、2^31-1バイトを超える大きなデータには以下を使用します。

void*         XXH32_init   (unsigned int seed);
XXH_errorcode XXH32_update (void* state, const void* input, int len);
unsigned int  XXH32_digest (void* state);
1
Majid Azimi