静的ハッシュと動的ハッシュの主な違いは、静的ハッシュでは結果のデータバケットのアドレスが常に同じであるのに対し、動的ハッシュではレコードの増減に応じてデータバケットが大きくなったり小さくなったりすることである。
大規模なデータベースでは、すべてのインデックスを検索してデータを見つけることは不可能である。
ハッシュ化はこの問題に対する代替手段を提供する。
さらに、インデックスを使わずに、ディスク上のデータの位置を直接計算することができる。
ハッシュは、ハッシュ関数と呼ばれる数学的な関数を用いて、データレコードのアドレスを生成する。
また、データを格納するメモリ上の位置をデータバケットと呼ぶ。
ハッシュには静的ハッシュと動的ハッシュと呼ばれる2つのタイプがあります。
スタティックハッシュとは
静的ハッシュでは、結果のデータのバケットアドレスは常に同じです。
言い換えれば、バケットアドレスは変わりません。
したがって、この方法では、メモリ上のデータバケットの数はずっと一定です。
静的ハッシュの操作は以下の通りです。
挿入-スタティックハッシュでレコードを入力する場合、ハッシュ関数(h)が検索キー(k)に対するバケットアドレスを計算し、そこにレコードが格納される。
バケットアドレス=h(K)。
検索 – レコードを取得する際、同じハッシュ関数でデータが格納されているバケットのアドレスを取得することができます。
削除 – レコードを取得した後、メモリ内のそのアドレスのレコードを削除することが可能である。
更新 – レコードをハッシュ関数で検索した後、そのレコードを更新することができる。
さらに、静的ハッシュの大きな問題点として、バケットのオーバーフローがあります。
この問題を克服する方法として、以下のようなものがあります。
オーバーフローチェイニング – バケットが満杯になったときに、同じハッシュ結果に対して新しいバケットを作成する。
Linear Probing – ハッシュ関数がすでにデータが格納されているアドレスを生成したときに、次に空いているバケットをデータ用に割り当てる。
ダイナミックハッシュとは
静的ハッシュでは、バケットのオーバーフローが問題となります。
ダイナミックハッシングはこの問題を解決するのに役立ちます。
Extendable hashing method とも呼ばれる。
この方法では、レコードの数に応じてデータのバケットが増減します。
これにより、挿入、削除などの操作を性能に影響を与えることなく行うことができる。
ダイナミックハッシングの操作は以下の通りです。
挿入 – バケットのアドレスを計算する。
バケットが既に満杯の場合、バケットを追加することが可能である。
さらに、ハッシュ値にビットを追加し、ハッシュ関数を再計算することも可能である。
バケットが満杯でない場合は、バケットにデータを追加することが可能である。
問い合わせ – ハッシュインデックスの深度値をチェックし、そのビットを使ってバケットアドレスを計算する。
更新 – クエリーを実行し、データを更新します。
Delete – クエリを実行し、削除したいデータを探します。
Static HashingとDynamic Hashingの違い
定義
静的ハッシュは、ユーザーが確定した辞書セット(辞書内のすべてのオブジェクトが確定しており、変更されない)に対して検索を実行できるハッシュ技術です。
これに対し、動的ハッシュは、データバケットが動的に、かつオンデマンドで追加・削除されるハッシュ技術です。
したがって、これが静的ハッシュと動的ハッシュの主な違いです。
機能性
静的ハッシュでは、結果のデータバケットアドレスは常に同じです。
しかし、ダイナミックハッシングでは、レコードによってデータバケットが変化する。
この点も静的ハッシュと動的ハッシュの大きな違いです。
効率性
静的ハッシュと動的ハッシュのもう一つの違いは、効率性です。
動的ハッシュの方が静的ハッシュより効率が良い。
結論
簡単に説明すると、ハッシュ関数と呼ばれる数学的な関数を用いて、ディスク上のデータレコードの位置を直接計算する方法がハッシュです。
さらに、ハッシュには静的ハッシュと動的ハッシュの2種類があります。
静的ハッシュと動的ハッシュの主な違いは、静的ハッシュでは結果のデータバケットアドレスが常に同じであるのに対し、動的ハッシュではレコードの増減に応じてデータバケットが拡大・縮小する点です。