ハッシュ関数でmodとして素数を使用するのが最適なのはなぜですか?


57

1〜100のキー値のリストがあり、それらを11個のバケットの配列に整理したい場合、mod関数を作成するように教えられました。

H=kmod 11

これで、すべての値が9行に次々と配置されます。たとえば、最初のバケットには0、11、22 0,11,22ます。2番目では1,12,23などがあります。

悪い子になって、ハッシュ関数として非プライムを使用することにしたとしましょう-テイク12.ハッシュ関数の使用

H=kmod 12

値をハッシュテーブルにつながる0,12,24最初のバケットで、1,13,25等秒でのように。

本質的には同じものです。衝突を減らさなかったし、素数ハッシュコードを使用して物事をうまく分散させることもしなかったので、それがどのように有益であるかわかりません。


我々はハッシュ関数でXORを使用する理由、関連する質問、stackoverflow.com/questions/5889238/...
shuva

回答:


62

一連のキーK={0,1,...,100}と、バケットの数がm = 12であるハッシュテーブルについて考えますm=12。以来、3の因子である12の倍数であるキー3の倍数であるバケットにハッシュされる3

  • キー{0,12,24,36,...}は、バケット0にハッシュされます0
  • キーはバケットハッシュされます。{3,15,27,39,...}3
  • キーは、バケットハッシュされます。{6,18,30,42,...}6
  • キーはバケットハッシュされます。{9,21,33,45,...}9

が均一に分布している場合(つまり、すべてのキーが等しく発生する可能性が高い場合)、の選択はそれほど重要ではありません。しかし、が均一に分布していない場合はどうなりますか?発生する可能性が最も高いキーがの倍数であると想像してください。この場合、倍数ではないバケットはすべて、高い確率で空になります(ハッシュテーブルのパフォーマンスの点で非常に悪いです)。KKmK33

この状況はより一般的であると思われるかもしれません。たとえば、オブジェクトがメモリ内のどこに保存されているかに基づいてオブジェクトを追跡しているとします。コンピューターのワードサイズが4バイトの場合、倍数のキーをハッシュします。言うまでもなく、を倍数に選択するのは恐ろしい選択ですバケットが完全に空になり、残りのバケットですべてのキーが衝突します。4m43m/4m/4

一般に:

バケット数と共通の要因を共有するすべてのキーは、この要因の倍数であるバケットにハッシュされます。Km

したがって、衝突を最小限に抑えるには、との要素の間の共通因子の数を減らすことが重要です。どうすればこれを達成できますか?を選択して、非常に少数の要素を持つ数:素数にしますmKm


私の質問があなたの答えと一致しているのを見ました。私のクエリのハッシュ関数は適切だと思いますか?
過剰交換16

@overexchange:あなたの質問に答えました。この回答もあなたの興味を引くかもしれません。
マリオサーベラ

Kが歪んでいる場合にのみmの選択が重要になるのはなぜですか?Kが均一に分布していても、mが悪いとパフォーマンスが低下するのは本当ですか?
vorou

「bad」の意味に依存します。「ハッシュテーブルの要素数と比較して小さい」(つまり、高い負荷係数)を意味する場合、パフォーマンスは低下します。ただし、「素数ではない」という場合、すべてのキーがハッシュテーブルに均等に分散されるため、すべてのキーが等しくなる可能性がある場合、この事実はそれほど重要ではありません。質問自体が例を示しています。m
マリオ・セルベラ

16

衝突が素数を使用する可能性が低いかどうかは、キーの分布に依存します。

キーの多くがの形式であり、ハッシュ関数がである場合、これらのキーはが除算する場合にバケットの小さなサブセットに移動します。したがって、このようなの数を最小限に抑える必要があります。これは素数を選択することで実現できます。a+kbH(n)=nmodmbnb

一方、あなたが持っているしたい場合はへのバケットを、あなたがの倍数であることを知っているの違いの倍数で違いよりも可能性があると、あなたが選ぶことができるあなたの非常に特別なアプリケーションのために。1112112312


1
しかし、キーの形式がない場合、は重要はありませんか?そうですか?a+k×bm
CodyBugstein

1
@lmray、キーが均一に分散されている場合、は重要はありません。そうでない場合、が重要かどうかの精度分布に依存します。mm
AProgrammer

最後の編集を元に戻しただけで、を忘れていました。12>11
frafl

3
「が分割する場合、バケットの小さなサブセットに移動する」という意味ですか?bm
ミハイルドゥボフ

8

これが(また)影響を与えるかどうかは、衝突の処理方法によって異なります。オープンハッシュのいくつかのバリアントを使用する場合、プライムを使用すると、テーブルが十分に空である限り空のスロットが見つかることが保証されます。

たとえば、次のものを表示してみてください。

ハッシュする要素を挿入してをアドレス指定しその後に対して位置試行して衝突を解決とします。aa+i2i=1,2,

ハッシュテーブルのサイズが、がより大きい素数で、すべての位置の少なくとも半分が空いている場合、このプロシージャは常に空の位置を生成することを示します。pp3

ヒント:剰余リングモジュロという事実を使用しあればフィールドで素数であるため、、せいぜい持っているソリューションを。ppi2=c2


2

ハッシュ関数の形式がで、が素数でがランダムに選択される場合、2つの異なるキーが同じバケットにハッシュする確率はです。そうするため、非常に小さいです。h(k)=a×kmodmma1mm=1009Pr{h(x)=h(y),xy}=0.00099108027

このスキームは、Universal Hashingとして知られています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.