ダブルハッシュ法とは
ダブルハッシュ法(Double Hashing)とは、ハッシュテーブルにおいて、キーのハッシュ値が既に他のキーによって占有されている場合(衝突が発生した場合)に、次の探査位置を決定するために、最初のハッシュ関数とは異なる第二のハッシュ関数を用いる衝突回避策の一つです。
これにより、単純な線形探査や二次探査と比較して、クラスタリング(衝突が連鎖的に発生する現象)を抑制し、より均等なデータ分布と効率的な探索を実現することが期待されます。
ダブルハッシュ法 の基本概念
ハッシュテーブルでは、キーをハッシュ関数に通して得られたハッシュ値をインデックスとして、データを格納します。しかし、異なるキーが同じハッシュ値を持つ衝突は避けられません。衝突が発生した場合、何らかの方法で空いているスロットを探し、データを格納する必要があります。
ダブルハッシュ法では、衝突が発生した際に、最初のハッシュ関数 h1(key) に加えて、第二のハッシュ関数 h2(key) を用います。この h2(key) の結果は、次の探査ステップの幅として利用されます。つまり、最初のハッシュ値 h1(key) が衝突した場合、次の探査位置は (h1(key)+h2(key))modsize となり、さらに衝突が続く場合は (h1(key)+2⋅h2(key))modsize, (h1(key)+3⋅h2(key))modsize … というように、第二のハッシュ関数の結果の倍数を加算しながら探査を行います。ここで、size はハッシュテーブルのサイズです。
ダブルハッシュ法 の仕組み
- 最初のハッシュ値の計算: キー k に対して、最初のハッシュ関数 h1(k) を用いて初期のハッシュ値 v1=h1(k)modsize を計算します。
- 衝突の検出: インデックス v1 のスロットが既に占有されている場合、衝突が発生します。
- 第二のハッシュ値の計算: 衝突が発生した場合、同じキー k に対して、第二のハッシュ関数 h2(k) を用いて第二のハッシュ値 v2=h2(k)modsize′ を計算します。ここで、size′ は通常、size と互いに素な値(例えば、size より小さい素数)を選ぶことが望ましいです。また、h2(k) の結果が 0 にならないように設計する必要があります。
- 探査シーケンスの生成: 衝突が解消されるまで、以下の式に基づいて探査するインデックスを生成します。 probe(i)=(v1+i⋅v2)modsize ここで、i=0,1,2,… は探査の試行回数です。
- 空きスロットの発見: 生成されたインデックスのスロットが空いている場合、その位置にデータを格納します。探索時にも同様のシーケンスを辿り、キーと一致するデータが見つかれば探索成功、空のスロットに到達すればキーが存在しないと判断します。
ダブルハッシュ法 の利点
- クラスタリングの軽減: 異なるキーに対して、最初のハッシュ値が衝突しても、第二のハッシュ関数の結果が異なれば、その後の探査シーケンスが異なるため、線形探査や二次探査で問題となるクラスタリング(衝突が連続する領域の形成)を効果的に軽減できます。
- 均等な分布の促進: 衝突時の探査ステップ幅がキーに依存するため、データがハッシュテーブル全体に比較的均等に分布しやすくなり、平均探索時間の短縮が期待できます。
- 削除処理の複雑性: 線形探査などと同様に、削除されたスロットを単純に空きとマークすると、その後の探索が途中で終了してしまう可能性があるため、特別なマーキングや再ハッシュなどの処理が必要になる場合があります。
ダブルハッシュ法 の欠点
- 第二のハッシュ関数の設計: 第二のハッシュ関数 h2(k) は、以下の条件を満たすように適切に設計する必要があります。
- h2(k) の結果が 0 にならないこと(探査ステップ幅が 0 になると無限ループに陥る可能性があります)。
- h2(k) の結果がハッシュテーブルのサイズ size と互いに素であることが望ましい(これにより、探査シーケンスがテーブル全体を網羅する可能性が高まります)。
- 実装の複雑さ: 線形探査などに比べると、実装がやや複雑になります。
- テーブルサイズの制約: 効率的な動作のためには、ハッシュテーブルのサイズを適切に保つ必要があります。テーブルが満杯に近づくと、衝突の頻度が増加し、性能が劣化します。
ダブルハッシュ法 の応用
ダブルハッシュ法は、高い探索効率が求められるハッシュテーブルの実装において、衝突解決戦略の一つとして利用されます。例えば、コンパイラのシンボルテーブル、データベースのインデックス、キャッシュの管理など、様々な情報システムで採用されることがあります。
ダブルハッシュ法は、ハッシュテーブルにおける衝突問題を、第二のハッシュ関数を用いて探査ステップ幅を決定することで解決する効果的な手法です。クラスタリングを抑制し、データ分布の均等化を図ることで、効率的なデータの挿入、削除、検索を実現します。ただし、第二のハッシュ関数の適切な設計やテーブルサイズの管理が、その性能を最大限に引き出すためには重要となります。
関連用語
お問い合わせ
システム開発・アプリ開発に関するご相談がございましたら、APPSWINGBYまでお気軽にご連絡ください。
APPSWINGBYの
ソリューション
APPSWINGBYのセキュリティサービスについて、詳しくは以下のメニューからお進みください。
システム開発
既存事業のDXによる新規開発、既存業務システムの引継ぎ・機能追加、表計算ソフトによる管理からの卒業等々、様々なWebシステムの開発を行っています。
iOS/Androidアプリ開発
既存事業のDXによるアプリの新規開発から既存アプリの改修・機能追加まで様々なアプリ開発における様々な課題・問題を解決しています。
リファクタリング
他のベンダーが開発したウェブサービスやアプリの不具合改修やソースコードの最適化、また、クラウド移行によってランニングコストが大幅にあがってしまったシステムのリアーキテクチャなどの行っています。

ご相談・お問い合わせはこちら
APPSWINGBYのミッションは、アプリでビジネスを加速し、
お客様とともにビジネスの成功と未来を形作ること。
私達は、ITテクノロジーを活用し、様々なサービスを提供することで、
より良い社会創りに貢献していきます。
T関する疑問等、小さなことでも遠慮なくお問合せください。3営業日以内にご返答致します。

ご相談・お問合せはこちら
APPSWINGBYのミッションは、アプリでビジネスを加速し、お客様とともにビジネスの成功と未来を形作ること。
私達は、ITテクノロジーを活用し、様々なサービスを提供することで、より良い社会創りに貢献していきます。
IT関する疑問等、小さなことでも遠慮なくお問合せください。3営業日以内にご返答させて頂きます。