9

ルックアップテーブルのハッシュ関数が必要なので、値が0からNの場合、0からnまでの値(n << N)を与えるハッシュ関数が必要です。もう1つの情報は、すでにNを事前に知っています。

私はさまざまな低コストのハッシュ関数について調査してきましたが、これだけを見つけました:

h = z mod n  range(z) - 0 to N, range(h) - 0 to n

私のハッシュ関数はHWで実装する必要があるので、非常に低コストである必要があります。その単純なこと以外に、他の式やアルゴリズムを推奨できる人はいますか?私がHWと言うとき、私はHWでの真の実装を意味し、マイクロプロセッサでの命令ではありません。

ありがとうございました。

ソリューションで更新する

すべての回答に感謝します。ターゲットアプリケーションの特性に応じてすべてが等しく有効であるため、お気に入りのものを選択するつもりはありません。

4

5 に答える 5

5

a と bはh(x) = (a*x + b) mod n定数で、n はハッシュ テーブルのサイズです。n素数を作成して、最適な(っぽい)分布を取得します。

これは、特定の種類の分布に敏感であることに注意してください。たとえば、x mod nほとんどの場合、下位ビットのランダム性に依存しています。セット内でそれらがランダムでない場合、かなり大きなスキューが発生します。

Bob Jenkins は、いくつかの非常に優れたハッシュ関数を設計しました。これは、ハードウェアに簡単に実装できるように特別に設計されたものです: http://burtleburtle.net/bob/hash/nandhash.html

さまざまなハッシュ関数、設計に関する議論などについては、サイトの残りの部分を参照してください: http://burtleburtle.net/bob/hash/

于 2009-01-16T22:20:46.863 に答える
3

CRC?

これについても、すでに多くのハードウェア サポートがあります。

于 2009-01-16T22:12:36.690 に答える
2

0..N のすべての数値の確率が同じであることを考えると、これがこの問題の可能な限り最良のハッシュであると思います (モジュロよりも速く、より良い分布)。

h = z * n / N;

すべての値が整数であるため、整数除算があります。このように、0..N の間の各値は、n のまったく同じ数の値にマップされます。

たとえば、n=3 および N=7 (範囲に含まれない値 3 および 7) の場合、ハッシュは次のようになります。

z * n / N = hash
----------------
0 * 3 / 7 = 0
1 * 3 / 7 = 0
2 * 3 / 7 = 0
3 * 3 / 7 = 1
4 * 3 / 7 = 1
5 * 3 / 7 = 2
6 * 3 / 7 = 2

したがって、各ハッシュ値は均等に使用され、1 だけずれますn*(N-1)。オーバーフローしないように注意してください。

N が 2 の累乗の場合、除算をシフトで置き換えることができます。たとえば、N=256 の場合:

h = (z * n) >> 8;
于 2009-01-16T22:22:21.117 に答える
1

ランダムな順序でビットを再配線し、下位log2(n)ビットを取る

またはlog2(n)、データが均等に分散されている場合は、下位ビットを取ります。

于 2009-01-16T21:55:41.373 に答える
1

本当にハードウェア (対ソフトウェア、またはソフトウェアのハードウェア実装) について話していて、ハッシュ バケットの数 n を n = 2 m - 1 と書くことができる場合、最も簡単なのはおそらく最大長の線形フィードバック シフト レジスタです( LFSR) のうち、CRC はインスタンスです。

m ビット シフト レジスタを使用してデータ パケットのハッシュを作成する方法の 1 つを次に示します (文字列が短い場合は、すべてのデータが一貫して K ビット文字列として表されるようにし、一方の端をゼロで埋めます)。

  1. LFSR の状態を初期化します (CRC-32 はすべて 1 を使用します。すべてゼロはおそらく悪いことです)。
  2. データのビットをシフトする
  3. (オプション) 追加の j 個のゼロをシフトします (m から 2m の間の j がおそらく適切な選択です)。これにより、入力/出力ビット間の直接的な相関関係を減らすためにハッシュが追加されます
  4. m ビット シフト レジスタの内容をハッシュ値として使用します。
于 2009-01-16T22:56:29.020 に答える