2012-03-22 13 views
0

3つの短絡に基づいてハッシュ関数を作成する必要があります。これを行う最善の方法は何ですか?3つの短絡のハッシュ関数

編集 私はPointというオブジェクトを持っています。これは3つの短絡(x、y、z)で構成されています。 QSET以内にこのオブジェクトを使用するためには、私はあなたがハッシュ関数から必要なものに多くを依存して、以下の機能

uint qHash(const Point &point) { 
    // return something here that is a unique combination of x, y, z so that 
    // it is very quick to calculate and has minimal (if any) hash collisions 
} 
+0

「3つのショートパンツに基づいて」とはどういう意味ですか? – zneak

+0

私はそれに応じて私の質問を更新しました。 – Jon

+0

48ビットを32ビットに圧縮しようとすると、必然的に衝突が可能になります。 – zneak

答えて

2

の本体に記入しなければなりません。

スピードが重要ですか?

ほぼ完全なハッシュ分布は重要ですか?

ハッシュキーのサイズはどれくらいですか? 32ビット? 64ビット?より大きい?

その他の細目についての知識がなければ、あなたはこれらの線に沿って何かを検討する必要があります。

uint hash = (31 * 31 * 31 * (uint)short1)^(31 * 31 * (uint)short2)^(31 * short3); 

ショートパンツの入力値がある場合でも、高速になり、ビットの合理的な分布を持っている必要がありますuintを入力する

修正されたコードサンプル:ウェル

UPDATEに分布していません。私の変種は、入力が512あなたは、私が31の力によって、各入力を掛ける理由を理解することに興味があるなら

の範囲0であれば、うまく動作

Why does Java's hashCode() in String use 31 as a multiplier?

+0

私は私の質問に多くの情報を追加しました。 – Jon

+0

@Jon:私のハッシュ関数は、あなたの必要に応じてうまくいくはずです。 –

+0

31は、実行される値の端数がある場合の適切な乗数ですが、正確に3つの値がわかっている場合は、より大きな値が良いと思います。 – supercat

1

3かどうかを確認すべきです0からnumBuckets - 1に特定の範囲に減少し、あなたに短いを与える

hashVal = (short1 xor short2 xor short3) modulo numBuckets 

:ショートパンツが比較的均一に分散されている、あなただけのようなものを使用することができます。

適切かどうかは、入力値がどのように分配されるか、またハッシュ関数から期待されるものに大きく依存します。

あなたの質問に基づいて、ハッシュは符号なしintに入り、16ビットのshortと32ビットのunsigned intと仮定して編集すると、衝突を完全に回避する方法はありません(そのためには48ビットが必要です)。

hashVal = (x leftshift 16) logical-or (y leftshift 8) logical-or (z) 

これは、結合します(論理またはで)ので、自分の価値観:

xxxxxxxxxxxxxxxx0000000000000000 
     yyyyyyyyyyyyyyyy00000000 
       zzzzzzzzzzzzzzzz 

と、少なくともお互いに影響を与えるまねx/y/z値の可能性を最小限に抑える一つの可能​​性は使用することです。

そして、さらにあなたのコメントへ:

私はどのようにそれは私の決定に影響を与える512に私の入力値が0の範囲内であることを期待しますか?

入力値が0〜512の範囲に制限されている場合は、それぞれに10ビットしか必要ありません(0〜1023の値が与えられます)。その場合には、それらのうち3つは簡単に32ビット符号なし整数に収まるので、あなたが使用できます。

hashVal = (x leftshift 20) logical-or (y leftshift 10) logical-or (z) 

これは、衝突の絶対にチャンスがないと、完璧なハッシュを提供します。

+0

何時、SO上のポストタイムの秒未満の解像度はありませんか? :-)最初の正確な結びつきは、私が入っていた2番目のものになります。 –

+0

実際には、@エリック、私は "X分前"のテキストにカーソルを合わせると、5:49:39にあなたを取得し、5:49:40に私を取得しますだから私は投稿に私をピックしたかもしれないと思う:-) – paxdiablo

+0

私は入力値が0から512までの範囲にあることを期待しています。 – Jon