ウィキペディアや Google が見つけたさまざまな .edu Web サイトなどのさまざまな情報源によると、ハッシュ テーブルが衝突を解決する最も一般的な方法は、線形または二次プローブとチェーンです。ランダム化されたプロービングについては簡単に言及されていますが、あまり注目されていません。ランダム化されたプロービングを使用して衝突を解決するハッシュ テーブルを実装しました。衝突があると仮定すると、解決は次のように機能します。
- オブジェクトの完全な (32 ビット) ハッシュは、線形合同乱数ジェネレーターをシードするために使用されます。
- ジェネレーターは 32 ビットの数値を生成し、モジュラスを使用して、次にプローブするハッシュ テーブル内の場所を決定します。
これには、モジュラス空間にハッシュ衝突がいくつあっても、完全な 32 ビット ハッシュ空間で衝突がほとんどない限り、ルックアップと挿入の時間は O(1) であると予想されるという非常に優れた特性があります。プローブ シーケンスは疑似ランダムであるため、線形プローブとは異なり、モジュラス空間の衝突によるクラスタリング動作は発生しません。システム全体がオープン アドレスであり、リンク リストをどこにも使用しないため、連鎖とは異なり、挿入ごとにメモリ割り当てを実行する必要はありません。
さらに、ハッシュのサイズは通常、アドレス空間のサイズ (32 ビット マシンでは 32 ビット) であるため、完全な 32 ビット ハッシュで多数のハッシュ衝突を引き起こすのに十分なアイテムをアドレス空間に収めることは単純に不可能です。適切なハッシュスキームの下のスペース。
では、なぜランダム化されたプロービングがこのような人気のない衝突解決戦略なのですか?