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)
これは、衝突の絶対にチャンスがないと、完璧なハッシュを提供します。
「3つのショートパンツに基づいて」とはどういう意味ですか? – zneak
私はそれに応じて私の質問を更新しました。 – Jon
48ビットを32ビットに圧縮しようとすると、必然的に衝突が可能になります。 – zneak