ハッシュテーブルバケットがプライムナンバーを取るのはなぜですか?
ハッシュ関数を持っています
h(c)= c%n;
nが複合番号を取得した場合、最も簡単な例は、たとえば、この時点で2^3 = 8を取ることです。
H(11100(バイナリ))= H(28)= 4
H(10100(バイナリ))= H(20)= 4
この時点で、Cのバイナリ(右から左へ)の4ビットは「失敗」します。つまり、Cの4ビットでどのような値が取られても、H(C)の同じ値につながります。この時点で、Cの4番目のビットはH(C)の操作にまったく関与していないため、H(C)はCの特性を完全に反映できず、競合の可能性を高めます。
他の複合番号を取得すると、Cの一部のビットがさまざまな程度に「失敗」され、一部の一般的なアプリケーションで競合が発生します。
ただし、素数を取得することで、基本的にCの各ビットがH(C)の操作に参加することを保証することで、共通のアプリケーションでの競合の可能性が減少します。 。
(個人的な意見:プライムナンバーを取得しないという効率はそれほど悪くないことがあります...しかし、プライムナンバーを取る方が間違いなく安全です...)
上記は私の理解です
これに追加するために、これは一般的なアプリケーションでは、一部のデータが類似していることが多いことを意味します。現時点では素数を使用する方が良いです。たとえば、保存するデータは、現在の検索状態を説明するテーブルを保存するなど、圧縮状態です。現時点では、素数なしでハッシュする確率は比較的高くなっています。
ランダムに分布した整数である場合、ハッシュモジュラスは十分に大きく採用されている限り同じですが、これは明らかに実用的なアプリケーションから外れています。
あなたが言ったことは特別な状況です。なぜなら、比較的小さな素数が選択されている場合、大きな素数nが選択されている場合、N-digitシステムの特定のビットでのみ失敗する可能性があるためです。コンピューターシステムの特性と組み合わせることで、N-digit表現はしばしば重要ではありませんが、一般的に使用される2^n-digitシステムはより重要であるため、競合を回避できます。
実際、私はそれをテストするために多数を使用して、圧縮された隣接マトリックスをバイナリに保存しました。モジュラスが十分に大きい場合、複合数でさえプライムナンバーに非常に密接な影響を与える可能性がありますが、一部の(数ダースの)複合数では、効率が大幅に低下するため、素数は比較的安全です。
独自の実験を行うことも、ランダムな整数を選択しないでください。ただし、いくつかの一般的なアプリケーションを検討し、主に平均負荷係数を調べるために素数と複合番号を使用して、得られる結論は私のものと同じかもしれません。
私は個人的に、より一般的な意味で、あなたが素数をとらなければ、何らかの危険があると思います。危険は、非プライム数m = x*yが選択されていると想定され、ハッシュの鍵がたまたまこの除数Xに関連している場合、それは悲惨になります。最悪の場合、すべてがXの倍数であると仮定していると、ハッシュの結果は1〜y、1〜mではないことを想像できます。ただし、バケットのサイズがプライムナンバーとして選択されている場合、問題はありません。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!