(57)【要約】【課題】データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させる。【解決手段】データセットを複数のデータセットに分割し、各データセットのハッシュ関数を決定し、各ハッシュ関数を特定するハッシュ係数値情報及びハッシュ係数値とデータセットの対応情報を作成し、各データセットのハッシュ情報２２を作成する処理をコンピュータに実行させるプログラムで、ハッシュ関数決定処理において、データセット毎に、データセットの各データのキーに基づいて候補ハッシュ関数でハッシュ値を求め、これに基づく第１番地又はこれに連続する第２番地に全データを格納できると判定したデータセットのハッシュ関数として候補ハッシュ関数を決定し、ハッシュ情報作成処理において、データセット毎に、第１又は第２番地にデータ及びキーを格納してデータセットに対するハッシュ情報を作成する。【選択図】図１
2014130489.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
データセットを複数のデータセットに分割し、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行させ、
前記複数のハッシュ関数を決定する処理において、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第１格納位置又は前記第１格納位置に連続する第２格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータに実行させ、
前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第１格納位置又は前記第２格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータに実行させることを特徴とするデータ格納プログラム。
【請求項２】
前記対応情報を作成する処理において、キャッシュメモリ上に保持しうる情報量の対応情報を作成する処理を前記コンピュータに実行させ、
前記ハッシュ係数値情報を作成する処理において、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成する処理を前記コンピュータに実行させることを特徴とする、請求項１に記載のデータ格納プログラム。
【請求項３】
前記複数のハッシュ関数を決定する処理において、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、請求項１又は２に記載のデータ格納プログラム。
【請求項４】
前記複数のハッシュ関数を決定する処理において、前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが２つ以上ある場合に、前記候補ハッシュ関数を前記２つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定する処理を含む処理を前記コンピュータに実行させ、
前記対応情報を作成する処理において、一つのハッシュ関数を特定するハッシュ係数の値と前記２つ以上のデータセットとを対応づけている対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、請求項１〜３のいずれか１項に記載のデータ格納プログラム。
【請求項５】
前記複数のハッシュ関数を決定する処理において、前記複数のデータセットのそれぞれに対する複数のハッシュ関数として１６個又は３２個のハッシュ関数を決定する処理を前記コンピュータに実行させ、
前記対応情報を作成する処理において、前記複数のハッシュ関数のそれぞれを特定する前記複数のハッシュ係数の値と前記複数のデータセットとを対応づけ、かつ、４ビット又は５ビットで構成されている複数のインデックスを含む対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、請求項１〜４のいずれか１項に記載のデータ格納プログラム。
【請求項６】
コンピュータに、
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第１格納位置及び前記第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出し、
前記第１格納位置又は前記第２格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
処理を実行させることを特徴とするデータ検索プログラム。
【請求項７】
データセットを複数のデータセットに分割するデータ分割部と、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定するハッシュ関数決定部と、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成するハッシュ係数値情報作成部と、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成する対応情報作成部と、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成するハッシュ情報作成部とを備え、
前記ハッシュ関数決定部は、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第１格納位置又は前記第１格納位置に連続する第２格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定し、
前記ハッシュ情報作成部は、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第１格納位置又は前記第２格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成することを特徴とするデータ検索装置。
【請求項８】
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定するハッシュ情報特定部と、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得するハッシュ係数値取得部と、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算するハッシュ値計算部と、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第１格納位置及び前記第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出す読出部と、
前記第１格納位置又は前記第２格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する出力部とを備えることを特徴とするデータ検索装置。
【請求項９】
コンピュータが、
データセットを複数のデータセットに分割し、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値情報を作成し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行し、
前記複数のハッシュ関数を決定する処理において、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第１格納位置又は前記第１格納位置に連続する第２格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータが実行し、
前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第１格納位置又は前記第２格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータが実行することを特徴とするデータ格納方法。
【請求項１０】
コンピュータが、
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第１格納位置及び前記第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出し、
前記第１格納位置又は前記第２格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
処理を実行することを特徴とするデータ検索方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法に関する。
【背景技術】
【０００２】
従来、データ検索方法の一つとして、ハッシュテーブルを用いたデータ検索方法がある。
ここで、ハッシュテーブルとは、テーブルにデータの格納する位置を決定する手段として、また、テーブルからデータを取得する位置を決定する手段として、ハッシュ関数を用いるテーブル型データ構造の一種である。
【０００３】
このハッシュテーブルを用いたデータ検索方法は、他のデータ検索方法（例えば二分木探索法）と比較して、データ検索効率が高い、即ち、検索対象データを発見する又はそれが存在しないと判断するまでに要する時間が短いという利点がある。
一方、ハッシュテーブルを用いたデータ検索方法は、ハッシュ関数によって求められたハッシュ値に基づいて特定される格納位置にデータを格納して作成されたハッシュテーブルを用いる。このハッシュ関数によって求められるハッシュ値が、異なるデータで同一になる場合があり、この場合に、これらのデータをハッシュテーブルにどのように格納し、検索するかによって、データ検索効率が低下することになる。
【０００４】
これに対し、ハッシュテーブルに格納する全てのデータの間でハッシュ値が重複しないことを保証する完全ハッシュ関数を用いることが考えられる。完全ハッシュ関数を用いて作成されたハッシュテーブルを用いる場合、異なるデータの間で格納位置が重複することがないため、データ検索時に格納位置を一意に特定することができ、理論上、データ検索効率が最も高くなり、最良のデータ検索効率が保証される。
【０００５】
しかしながら、所与のデータセットに対する完全ハッシュ関数を求めることは容易ではない。特に、大規模データセットに対する完全ハッシュ関数を求めることは容易ではない。例えば、総当り方式（ブルートフォース方式）で完全ハッシュ関数を算出する場合の算出コストはデータ数の増加に対して指数関数的に増大する。
これに対し、完全ハッシュ関数を算出する場合の算出コストを抑える方法として、大規模データセットを複数の小規模データセットに分割し、複数の小規模データセットのそれぞれに対して個別の完全ハッシュ関数を算出するＣＨＤアルゴリズムがある。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】D. Belazzougui, F. C. Botelho, M. Dietzfelbinger, “Hash, Displace, and Compress”, Lecture Notes in Computer Science Volume 5757, 2009, pp.682-693
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ところで、上述のＣＨＤアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数として、２つのハッシュ関数ｆ１（ｘ）、ｆ２（ｘ）と２つの作用素α、βによって規定される完全ハッシュ関数、即ち、式ｘ＝ｆ１（ｘ）＋αｆ２（ｘ）＋βを決め、これを用いてハッシュ値ｘを算出する。そして、この完全ハッシュ関数によって求められたハッシュ値に基づいてデータを格納してハッシュテーブルを作成することになる。しかしながら、この完全ハッシュ関数の決定、ハッシュ値の算出及びハッシュテーブルの作成には時間がかかる。このため、データの格納に時間がかかり、データ格納速度が遅くなる。
【０００８】
また、上述のＣＨＤアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数の作用素α、βをそれぞれ圧縮して保持し、データ検索時に圧縮された各作用素α、βを伸長して元の作用素とする。そして、この元の作用素を用いて上述の完全ハッシュ関数によってハッシュ値を算出し、算出されたハッシュ値を用いてデータを検索することになる。しかしながら、このハッシュ値の算出には時間がかかる。このため、データの検索に時間がかかり、データ検索速度が遅くなる。
【０００９】
そこで、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることを目的とする。
【課題を解決するための手段】
【００１０】
本データ格納プログラムは、コンピュータに、データセットを複数のデータセットに分割し、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応情報を作成し、複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行させ、複数のハッシュ関数を決定する処理において、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第１格納位置又は第１格納位置に連続する第２格納位置に複数のデータの全てを格納することができるか否かを判定し、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定する、処理をコンピュータに実行させ、複数のハッシュ情報を作成する処理において、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第１格納位置又は第２格納位置にデータ及びキーを格納してデータセットに対するハッシュ情報を作成する処理をコンピュータに実行させることを要件とする。
【００１１】
本データ検索プログラムは、コンピュータに、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算し、一のハッシュ情報から、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出し、第１格納位置又は第２格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する、処理を実行させることを要件とする。
【００１２】
本データ検索装置は、データセットを複数のデータセットに分割するデータ分割部と、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定するハッシュ関数決定部と、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成するハッシュ係数値情報作成部と、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応情報を作成する対応情報作成部と、複数のデータセットのそれぞれに対する複数のハッシュ情報を作成するハッシュ情報作成部とを備え、ハッシュ関数決定部は、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第１格納位置又は第１格納位置に連続する第２格納位置に複数のデータの全てを格納することができるか否かを判定し、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定し、ハッシュ情報作成部は、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第１格納位置又は第２格納位置にデータ及びキーを格納してデータセットに対するハッシュ情報を作成することを要件とする。
【００１３】
本データ検索装置は、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定するハッシュ情報特定部と、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得するハッシュ係数値取得部と、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算するハッシュ値計算部と、一のハッシュ情報から、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出す読出部と、第１格納位置又は第２格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する出力部とを備えることを要件とする。
【００１４】
本データ格納方法は、コンピュータが、データセットを複数のデータセットに分割し、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応情報を作成し、複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行し、複数のハッシュ関数を決定する処理において、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第１格納位置又は第１格納位置に連続する第２格納位置に複数のデータの全てを格納することができるか否かを判定し、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定した前記データセットに対するハッシュ関数として候補ハッシュ関数を決定する、処理をコンピュータが実行し、複数のハッシュ情報を作成する処理において、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第１格納位置又は第２格納位置にデータ及びキーを格納してデータセットに対するハッシュ情報を作成する処理をコンピュータが実行することを要件とする。
【００１５】
本データ検索方法は、コンピュータが、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算し、一のハッシュ情報から、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出し、第１格納位置又は第２格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する、処理を実行することを要件とする。
【発明の効果】
【００１６】
したがって、本データ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法によれば、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。
【図面の簡単な説明】
【００１７】
【図１】本実施形態にかかるデータ検索装置の構成を示す図である。
【図２】本実施形態にかかるデータ検索装置を備える情報処理装置のハードウェア構成を示す図である。
【図３】本実施形態にかかるデータ検索装置に備えられるデータ格納処理部（データ格納プログラム）による処理（データ格納方法）を示すフローチャートである。
【図４】本実施形態にかかるデータ検索装置に備えられるデータ格納処理部（データ格納プログラム）による処理（データ格納方法）を示すフローチャートである。
【図５】本実施形態にかかるデータ検索装置に備えられるデータ格納処理部（データ格納プログラム）による処理（データ格納方法）を示すフローチャートである。
【図６】本実施形態にかかるデータ検索装置に備えられるハッシュ関数インデックス表（対応表）及びハッシュ関数実体管理表（ハッシュ係数値表）を示す模式図である。
【図７】本実施形態にかかるデータ検索装置に備えられるデータ格納処理部（データ格納プログラム）による処理（データ格納方法）を示すフローチャートである。
【図８】本実施形態にかかるデータ検索装置に備えられるデータ格納処理部（データ格納プログラム）による処理（データ格納方法）を示すフローチャートである。
【図９】本実施形態にかかるデータ検索装置に備えられるデータ検索処理部（データ検索プログラム）による処理（データ検索方法）を示すフローチャートである。
【図１０】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおける格納対象のデータセットを示す図である。
【図１１】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおける格納対象のデータセットにおける各データのＣＲＣ３２値及びＣＲＣ３２値を「５」（小規模データセットの数）で割った余りの値を示す図である。
【図１２】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおける格納対象のデータセットを複数の小規模データセットに分割した結果を示す図である。
【図１３】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおける各小規模データセットにするハッシュ関数の割り当て結果を示す図である。
【図１４】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるハッシュ関数実体管理表（ハッシュ係数値表）を示す図である。
【図１５】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるハッシュ関数インデックス表（対応表）を示す図である。
【図１６】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「０」に含まれる各データのハッシュ値を「５」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図１７】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「０」に含まれる各データを、データセット番号「０」に対応するハッシュテーブルに格納した結果を示す図である。
【図１８】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「１」に含まれる各データのハッシュ値を「５」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図１９】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「１」に含まれる各データを、データセット番号「１」に対応するハッシュテーブルに格納した結果を示す図である。
【図２０】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「２」に含まれる各データのハッシュ値を「５」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図２１】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「２」に含まれる各データを、データセット番号「２」に対応するハッシュテーブルに格納した結果を示す図である。
【図２２】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「３」に含まれる各データのハッシュ値を「５」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図２３】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「３」に含まれる各データを、データセット番号「３」に対応するハッシュテーブルに格納した結果を示す図である。
【図２４】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「４」に含まれる各データのハッシュ値を「５」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図２５】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータセット番号「４」に含まれる各データを、データセット番号「４」に対応するハッシュテーブルに格納した結果を示す図である。
【図２６】本実施形態にかかるデータ検索装置を適用した従業員ＩＤ検索システムにおけるデータ検索処理部（データ検索プログラム）による処理（データ検索方法）を示すフローチャートである。
【図２７】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける格納対象のデータセットを示す図である。
【図２８】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける格納対象のデータセットにおける各データのＣＲＣ３２値及びＣＲＣ３２値を「４」（小規模データセットの数）で割った余りの値を示す図である。
【図２９】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける格納対象のデータセットを複数の小規模データセットに分割した結果を示す図である。
【図３０】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける各小規模データセットにするハッシュ関数の割り当て結果を示す図である。
【図３１】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるハッシュ関数実体管理表（ハッシュ係数値表）を示す図である。
【図３２】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるハッシュ関数インデックス表（対応表）を示す図である。
【図３３】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「０」に含まれる各データのハッシュ値を「４」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図３４】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「０」に含まれる各データを、データセット番号「０」に対応するハッシュテーブルに格納した結果を示す図である。
【図３５】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「１」に含まれる各データのハッシュ値を「５」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図３６】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「１」に含まれる各データを、データセット番号「１」に対応するハッシュテーブルに格納した結果を示す図である。
【図３７】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「２」に含まれる各データのハッシュ値を「４」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図３８】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「２」に含まれる各データを、データセット番号「２」に対応するハッシュテーブルに格納した結果を示す図である。
【図３９】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「３」に含まれる各データのハッシュ値を「５」（ハッシュテーブルのサイズ）で割った余りの値を示す図である。
【図４０】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「３」に含まれる各データを、データセット番号「３」に対応するハッシュテーブルに格納した結果を示す図である。
【図４１】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータ検索処理部（データ検索プログラム）による処理（データ検索方法）を示すフローチャートである。
【図４２】本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータ検索処理部（データ検索プログラム）による処理（データ検索方法）を含むデータ圧縮処理を示すフローチャートである。
【発明を実施するための形態】
【００１８】
以下、図面により、本発明の実施の形態にかかるデータ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法について、図１〜図４２を参照しながら説明する。
本実施形態にかかるデータ検索装置は、例えばサーバなどの情報処理装置に備えられ、データの格納及び検索を行なうのに用いられるものである。
【００１９】
まず、本データ検索装置を備える情報処理装置のハードウェア構成について、図２を参照しながら説明する。
本データ検索装置を備える情報処理装置は、例えばサーバなどのコンピュータを用いて実現することができ、そのハードウェア構成は、例えば図２に示すように、ＣＰＵ（Central Processing Unit）１０２、メインメモリ１０１、通信制御部１０９、入力装置１０６、表示制御部１０３、表示装置１０４、記憶装置１０５、可搬型記録媒体１０８のドライブ装置１０７を備え、これらがバス１１０によって相互に接続された構成になっている。なお、本装置のハードウェア構成はこれに限られるものではない。
【００２０】
ここで、ＣＰＵ１０２は、コンピュータ全体を制御するものであり、プログラムをメインメモリ１０１に読み出して実行し、データ検索装置を備える情報処理装置に必要な処理を行なうものである。また、ＣＰＵ１０２は、その内部にメインメモリ１０１よりも小容量で高速アクセス可能なキャッシュメモリ１１１を含む。このキャッシュメモリ１１１としては、例えばＳＲＡＭが用いられる。キャッシュメモリ１１１は、プログラムの実行等を行なう際に、頻繁にアクセスするデータを一時的に格納しておくものである。これをＣＰＵキャッシュ又はＣＰＵキャッシュメモリともいう。
【００２１】
メインメモリ１０１は、プログラムの実行等を行なう際に、プログラム又はデータを一時的に格納しておくものである。このメインメモリ１０１としては、例えばＤＲＡＭが用いられる。
通信制御部１０９（通信インターフェース）は、例えばＬＡＮやインターネットなどのネットワークを介して、他の装置と通信するために用いられるものである。この通信制御部１０９は、コンピュータに元から組み込まれていても良いし、後からコンピュータに取り付けられたＮＩＣ（Network Interface Card）でも良い。
【００２２】
入力装置１０６は、例えばマウスなどのポインティングデバイスやキーボードである。
表示装置１０４は、例えば液晶ディスプレイなどの表示装置である。
表示制御部１０３は、例えば分析結果などを表示装置１０４に表示させるための制御を行なうものである。
なお、これらの入力装置１０６や表示装置１０４は、ネットワークに接続された別のコンピュータに備えられている入力装置や出力装置であっても良い。
【００２３】
記憶装置１０５は、例えばハードディスクドライブ（ＨＤＤ）であり、各種のプログラム及び各種のデータが格納されている。本実施形態では、記憶装置１０５には、後述のデータ格納プログラムやデータ検索プログラムが格納されており、また、後述の大規模データセットが格納されている。なお、この記憶装置１０５のほかに例えばＲＯＭ（Read Only Memory）を備えるものとし、これに各種のプログラムや各種のデータを格納しておいても良い。
【００２４】
ドライブ装置１０７は、例えば光ディスクや光磁気ディスク等の可搬型記録媒体１０８の記憶内容にアクセスするためのものである。
このようなハードウェア構成を備えるコンピュータにおいて、ＣＰＵ１０２が、例えば記憶装置１０５に格納されているデータ格納プログラムやデータ検索プログラムをメインメモリ１０１に読み出して実行することで、本データ検索装置の各機能、即ち、データ格納処理機能、データ検索処理機能、ハッシュ係数値表記憶機能、対応表記憶機能、ハッシュテーブル記憶機能という各機能が実現される。
【００２５】
このため、図１に示すように、本データ検索装置１は、データ格納処理部２と、データ検索処理部３と、ハッシュ係数値表記憶部４と、対応表記憶部５と、ハッシュテーブル記憶部６とを備える。
ここで、データ格納処理部２は、データ分割部７と、ハッシュ関数決定部８と、ハッシュ係数値表作成部９と、対応表作成部１０と、ハッシュテーブル作成部１１とを備える。
【００２６】
このうち、データ分割部７は、データセットを複数のデータセットに分割する。
ハッシュ関数決定部８は、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定する。特に、ハッシュ関数決定部８は、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第１格納位置又は第１格納位置に連続する第２格納位置に複数のデータの全てを格納することができるか否かを判定し、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定する。ここで、ハッシュ関数決定部８は、データのキー列（キー文字列）｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれるハッシュ関数を候補ハッシュ関数として用いるのが好ましい。また、ハッシュ関数決定部８は、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定したデータセットが２つ以上ある場合に、候補ハッシュ関数を２つ以上のデータセットのそれぞれに対するハッシュ関数として決定するのが好ましい。また、ハッシュ関数決定部８は、複数のデータセットのそれぞれに対する複数のハッシュ関数として１６個又は３２個のハッシュ関数を決定するのが好ましい。
【００２７】
ハッシュ係数値表作成部９は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表２０（図６参照）を作成する。ここでは、ハッシュ係数値表作成部９は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値をＣＰＵキャッシュメモリ１１１上に格納して、ＣＰＵキャッシュメモリ１１１上にハッシュ係数値表２０（図６参照）を作成する。これにより、ＣＰＵキャッシュメモリ１１１上にハッシュ係数値表２０（図６参照）が保持され、ＣＰＵキャッシュメモリ１１１上にハッシュ係数値表２０（図６参照）を記憶するハッシュ係数値表記憶部４が作成される。このように、ハッシュ係数値表作成部９は、ＣＰＵキャッシュメモリ１１１上に保持しうる情報量のハッシュ係数値表２０（図６参照）を作成するのが好ましい。なお、ハッシュ係数の値は、ハッシュ関数の実体（entity）であるため、ハッシュ係数値表２０（図６参照）を、ハッシュ関数実体管理表又はハッシュ係数値情報ともいう。また、ハッシュ係数値表作成部９を、ハッシュ関数実体管理表作成部又はハッシュ係数値情報作成部ともいう。
【００２８】
対応表作成部１０は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表２１（図６参照）を作成する。ここでは、対応表作成部１０は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表２１（図６参照）をＣＰＵキャッシュメモリ１１１上に格納して、ＣＰＵキャッシュメモリ１１１上に対応表２１（図６参照）を作成する。これにより、ＣＰＵキャッシュメモリ１１１上に対応表２１（図６参照）が保持され、ＣＰＵキャッシュメモリ１１１上に対応表２１（図６参照）を記憶する対応表記憶部５が作成される。このように、対応表作成部１０は、ＣＰＵキャッシュメモリ１１１上に保持しうる情報量の対応表２１（図６参照）を作成するのが好ましい。また、対応表作成部１０は、候補ハッシュ関数を２つ以上のデータセットのそれぞれに対するハッシュ関数として決定する場合、一つのハッシュ関数を特定するハッシュ係数の値と２つ以上のデータセットとを対応づけている対応表を作成するのが好ましい。また、対応表作成部１０は、複数のデータセットのそれぞれに対する複数のハッシュ関数として１６個又は３２個のハッシュ関数を決定する場合、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づけ、かつ、４ビット又は５ビットで構成されている複数のインデックスを含む対応表を作成するのが好ましい。なお、対応表２１（図６参照）を、ハッシュ関数インデックス表又は対応情報ともいう。また、対応表作成部１０を、ハッシュ関数インデックス表作成部又は対応情報作成部ともいう。
【００２９】
ハッシュテーブル作成部１１は、複数のデータセットのそれぞれに対する複数のハッシュテーブル２２を作成する。特に、ハッシュテーブル作成部１１は、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第１格納位置又は第２格納位置にデータ及びキーを格納してデータセットに対するハッシュテーブル２２を作成する。なお、ハッシュテーブル２２を、ハッシュ情報ともいう。また、ハッシュテーブル作成部１１を、ハッシュ情報作成部ともいう。
【００３０】
データ検索処理部３は、ハッシュテーブル特定部１２と、ハッシュ係数値取得部１３と、ハッシュ値計算部１４と、読出部１５と、出力部１６とを備える。
このうち、ハッシュテーブル特定部１２は、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル２２の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル２２を特定する。なお、ハッシュテーブル特定部１２を、ハッシュ情報特定部ともいう。
【００３１】
ハッシュ係数値取得部１３は、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表２１（図６参照）及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表２０（図６参照）を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する。この場合、対応表２１及びハッシュ係数値表２０（図６参照）は、ＣＰＵキャッシュメモリ１１１上に保持しうる情報量になっていることが好ましい。また、対応表は、一つのハッシュ関数を特定するハッシュ係数の値と２つ以上のデータセットとを対応づけているものであることが好ましい。また、対応表は、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける複数のインデックスを含み、複数のインデックスは、それぞれ、４ビット又は５ビットで構成されていることが好ましい。また、複数のハッシュ関数は、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれるものであることが好ましい。また、複数のハッシュ関数は、１６個又は３２個のハッシュ関数であることが好ましい。
【００３２】
ハッシュ値計算部１４は、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する。
読出部１５は、一のハッシュテーブル２２から、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出す。
【００３３】
出力部１６は、第１格納位置又は第２格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する。
ハッシュ係数値表記憶部４は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表２０（図６参照）を記憶する。つまり、ハッシュ係数値表記憶部４は、上述のハッシュ係数値表作成部９によって作成されるハッシュ係数値表２０（図６参照）を記憶する。なお、ハッシュ係数の値は、ハッシュ関数の実体であるため、ハッシュ係数値表記憶部４を、ハッシュ関数実体管理表記憶部ともいう。また、ハッシュ係数値表記憶部４を、ハッシュ係数値情報記憶部ともいう。本実施形態では、ＣＰＵキャッシュメモリ１１１の記憶領域の一部がハッシュ係数値表記憶部４として使用される。つまり、上述のハッシュ係数値表作成部９によって作成されるハッシュ係数値表２０（図６参照）は、ＣＰＵキャッシュメモリ１１１上に保持される。
【００３４】
対応表記憶部５は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表２１（図６参照）を記憶する。つまり、対応表記憶部５は、上述の対応表作成部１０によって作成される対応表２１（図６参照）を記憶する。なお、対応表記憶部５を、ハッシュ関数インデックス表記憶部又は対応情報記憶部ともいう。本実施形態では、ＣＰＵキャッシュメモリ１１１の記憶領域の一部が対応表記憶部５として使用される。つまり、上述の対応表作成部１０によって作成される対応表２１（図６参照）は、ＣＰＵキャッシュメモリ１１１上に保持される。
【００３５】
ハッシュテーブル記憶部６は、複数のデータセットのそれぞれに対する複数のハッシュテーブル２２（ハッシュテーブルセット）を記憶する。つまり、ハッシュテーブル記憶部６は、上述のハッシュテーブル作成部１１によって作成された複数のハッシュテーブル２２を記憶する。なお、ハッシュテーブル記憶部６を、ハッシュ情報記憶部ともいう。本実施形態では、メインメモリ１０１の記憶領域の一部がハッシュテーブル記憶部６として使用される。つまり、上述のハッシュテーブル作成部１１によって作成された複数のハッシュテーブル２２は、メインメモリ１０１上に保持される。
【００３６】
次に、本データ検索装置においてＣＰＵ１０２がメインメモリ１０１に読み込まれたデータ格納プログラムやデータ検索プログラムに従って実行する処理（データ格納方法；データ検索方法）について、図３〜図９を参照しながら説明する。
まず、本データ検索装置に備えられるデータ格納処理部２による処理、即ち、本データ検索装置１においてＣＰＵ１０２がメインメモリ１０１に読み込まれたデータ格納プログラムに従って実行する処理（データ格納方法）について、図３〜図８を参照しながら説明する。
【００３７】
ここでは、データ格納処理部２は、データセットの格納依頼を受けると、以下の手順で、データセットを、メインメモリ１０１上に作成されるハッシュテーブル（ハッシュ情報）２２に格納する。
まず、データ格納処理部２は、格納対象のデータセットを受けとったら、図３に示すように、データ分割部７によって、格納対象のデータセットを複数のデータセットに分割する（ステップＳ１０）。
【００３８】
ここでは、データ格納処理部２は、データ分割部７によって、格納対象の大規模データセットを、複数の小規模データセットに分割する。例えば、大規模データセットを構成する複数のデータを、各小規模データセットが平均４つのデータを含むように、複数の小規模データセットに分割する。この場合、格納する大規模データセットを構成するデータの合計数がｎの場合、小規模データセットの数ｍを例えばＲＯＵＮＤ（ｎ÷４）で決定すれば良い。具体的には、格納対象の大規模データセットを構成する複数のデータのそれぞれのキーのＣＲＣ３２値を計算し、算出された各ＣＲＣ３２値を小規模データセットの数ｍで割った余りの値（ＣＲＣ値）を算出する。そして、算出されたＣＲＣ値が同じデータが同じ小規模データセットに含まれるように、ｎ個のデータを含む大規模データセットをｍ個の小規模データセットに分割する。つまり、算出されたＣＲＣ値を、ｍ個の小規模データセットの識別番号（データセット番号）として用い、ｎ個のデータを含む大規模データセットをｍ個の小規模データセットに分割する。例えば、ＳＳＥ４．２拡張命令セットをサポートするＣＰＵを用いる場合、ハードウェア的に組み込まれたＣＲＣ３２ｃ演算命令（組み込み関数名：ｃｒｃ３２）を用いて高速に大規模データセットを複数の小規模データセットに分割することができる。
【００３９】
次に、データ格納処理部２は、ハッシュ関数決定部８によって、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定する（ステップＳ２０）。つまり、複数のデータセットのそれぞれに対するハッシュテーブル２２を作成するのに用いる複数のハッシュ関数を決定する。特に、データ格納処理部２は、ハッシュ関数決定部８によって、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第１格納位置又は第１格納位置に連続する第２格納位置に複数のデータの全てを格納することができるか否かを判定し、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定する。また、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定したデータセットが２つ以上ある場合に、候補ハッシュ関数を２つ以上のデータセットのそれぞれに対するハッシュ関数として決定する。
【００４０】
次に、データ格納処理部２は、ハッシュ係数値表作成部９（ハッシュ関数実体管理表作成部；ハッシュ係数値情報作成部）によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表２０（ハッシュ関数実体管理表；ハッシュ係数値情報；図６参照）を作成する（ステップＳ３０）。ここでは、データ格納処理部２は、ハッシュ係数値表作成部９によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値をＣＰＵキャッシュメモリ１１１上に格納して、ＣＰＵキャッシュメモリ１１１上にハッシュ係数値表２０（図６参照）を作成する。これにより、ＣＰＵキャッシュメモリ１１１上にハッシュ係数値表２０（図６参照）が保持され、ＣＰＵキャッシュメモリ１１１上にハッシュ係数値表２０（図６参照）を記憶するハッシュ係数値表記憶部（ハッシュ係数値情報記憶部）４が作成される。このように、データ格納処理部２は、ハッシュ係数値表作成部９によって、ＣＰＵキャッシュメモリ１１１上に保持しうる情報量のハッシュ係数値表２０（図６参照）を作成するのが好ましい。
【００４１】
次に、データ格納処理部２は、対応表作成部１０（ハッシュ関数インデックス表作成部；対応情報作成部）によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表２１（ハッシュ関数インデックス表；対応情報；図６参照）を作成する（ステップＳ４０）。ここでは、データ格納処理部２は、対応表作成部１０によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表２１（図６参照）をＣＰＵキャッシュメモリ１１１上に格納して、ＣＰＵキャッシュメモリ１１１上に対応表２１（図６参照）を作成する。これにより、ＣＰＵキャッシュメモリ１１１上に対応表２１（図６参照）が保持され、ＣＰＵキャッシュメモリ１１１上に対応表２１（図６参照）を記憶する対応表記憶部（対応情報記憶部）５が作成される。このように、データ格納処理部２は、対応表作成部１０によって、ＣＰＵキャッシュメモリ１１１上に保持しうる情報量の対応表２１（図６参照）を作成するのが好ましい。また、データ格納処理部２は、候補ハッシュ関数を２つ以上のデータセットのそれぞれに対するハッシュ関数として決定する場合、対応表作成部１０によって、一つのハッシュ関数を特定するハッシュ係数の値と２つ以上のデータセットとを対応づけている対応表を作成するのが好ましい。
【００４２】
ここでは、これらの複数のハッシュ関数を決定する処理（ステップＳ２０）、ハッシュ係数値表を作成する処理（ステップＳ３０）及び対応表を作成する処理（ステップＳ４０）を並行して行なう場合であって、複数の小規模データセットに対して１６個のハッシュ関数を割り当てる場合を例に挙げて、以下、図４を参照しながら、具体的に説明する。
なお、ここでは、「ｉ」を「１」から「１６」まで１つずつインクリメントしていくことで（１≦ｉ≦１６）、インデックス番号１〜１６のそれぞれに対応する１６個のハッシュ関数を決定する。
【００４３】
まず、図４に示すように、データ格納処理部２は、ハッシュ関数決定部８によって、「ｉ」を「１」（ｉ＝１）とし（ステップＡ１０）、候補ハッシュ関数として、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数を選出する（ステップＡ２０）。例えば、ハッシュ係数Ｒの値を「１」として１つのハッシュ関数を選出し、これを候補ハッシュ関数とすれば良い。
【００４４】
次に、データ格納処理部２は、ハッシュ関数決定部８によって、選出した候補ハッシュ関数によって、小規模データセット毎に、それに含まれる複数のデータのそれぞれのキーに基づいてハッシュ値を算出する（ステップＡ３０）。ここでは、データ格納処理部２は、ハッシュ関数決定部８によって、ｍ個の小規模データセットの識別番号（データセット番号）の番号順に、各小規模データセットについて、選出した候補ハッシュ関数によって、それに含まれる複数のデータのそれぞれのキーに基づいてハッシュ値を算出する。
【００４５】
例えば、上述のように、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数を候補ハッシュ関数として選出する場合、上記の式を次の積和式に展開して、ハッシュ値を計算すれば良い。
【００４６】
【数１】
2014130489.tif 000003
【００４７】
このように、関数族から候補ハッシュ関数を選出することで、候補ハッシュ関数の選出が簡便となり、高速化を図ることが可能となる。また、上述のように再帰関数を非再帰関数に変換することで、例えばマルチプロセッサ並列処理やＣＰＵ命令プリフェッチを用いて、ハッシュ値の計算を高速化することが可能である。また、積和演算又はベクトル演算の計算機能を備えたＣＰＵを用いて（例えばＣＰＵのＳＩＭＤ命令を用いて）、その計算機能によって上述の積和式の計算を行なうことで、あるいは、並列計算（同時並列計算）が可能なＣＰＵ（例えばマルチコアＣＰＵ、即ち、単一のＣＰＵデバイスが複数のＣＰＵユニットを持つもの）や複数のＣＰＵを用いて、上述の積和式の並列計算を行なうことで、ハッシュ値の計算を高速に行なうことが可能となる。また、単一のハッシュ関数ｆＲ（ｘ）によってハッシュ値を計算するため、ｆ１（ｘ）＋αｆ２（ｘ）＋βで表される完全ハッシュ関数によってハッシュ値を計算する、即ち、２つのハッシュ関数ｆ１（ｘ）、ｆ２（ｘ）の計算を必要とする、上述のＣＨＤアルゴリズムと比較して、ハッシュ値の計算を高速に行なうことができる。これにより、データの格納処理を高速に行なうことが可能になる。
【００４８】
次いで、データ格納処理部２は、ハッシュ関数決定部８によって、小規模データセット毎に、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はこれに連続する格納位置（第２格納位置）に複数のデータの全てを格納することができるか否かを判定する（ステップＡ４０）。ここでは、データ格納処理部２は、ハッシュ関数決定部８によって、ｍ個の小規模データセットの識別番号（データセット番号）の番号順に、各小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はこれに連続する格納位置（第２格納位置）に複数のデータの全てを格納することができるか否かを判定する。
【００４９】
以下、各小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納することができるか否かを判定する場合を例に挙げて、図５を参照しながら説明する。
例えば、データ格納処理部２は、ハッシュ関数決定部８によって、まず、選出した候補ハッシュ関数によって１番目の小規模データセットに含まれる１つ目のデータのキーに基づいて算出したハッシュ値を、１番目の小規模データセットに対するハッシュテーブルのサイズで割った余りの値を算出し（ステップＢ１０）、この余りの値に相当する仮格納用ハッシュテーブルの番地（行；格納位置）に１つ目のデータを格納する（ステップＢ２０）。ここで、１番目の小規模データセットに含まれるデータの数ｎ′が「４」の場合、１番目の小規模データセットに対するハッシュテーブルのサイズを例えばＲＯＵＮＤ（ｎ′÷０．８）で「５」にすれば良い。なお、ハッシュテーブルのサイズが「５」とは、５つのデータを格納しうるハッシュテーブルであることを意味する。次に、選出した候補ハッシュ関数によって、１番目の小規模データセットに含まれる２つ目のデータのキーに基づいて算出したハッシュ値を、１番目の小規模データセットに対するハッシュテーブルのサイズで割った余りの値を算出し（ステップＢ１０）、この余りの値に相当する仮格納用テーブルの番地に２つ目のデータを格納する（ステップＢ２０）。以後、同様の処理を、１番目の小規模データセットに含まれる複数のデータの全てに対して行なう。これにより、１番目の小規模データセットに対する仮格納用テーブルが作成される。
【００５０】
次に、このようにして作成された１番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータの数が３つ以上であるかを判定する（ステップＢ３０）。
この判定の結果、この条件を満たしていないと判定した場合、ＮＯルートへ進み、（ｉ）１番目の小規模データセットに対する仮格納用テーブルの次の番地に格納されているデータの数が３つ以上であるか、（ｉｉ）次の番地に格納されているデータが２つで、かつ、最初の番地に格納されているデータが２つであるか、を判定する（ステップＢ４０）。
【００５１】
この判定の結果、これらの（ｉ），（ｉｉ）の２つの条件をいずれも満たしていないと判定した場合、ＮＯルートへ進み、１番目の小規模データセットに対する仮格納用テーブルのそれ以降の番地に格納されているデータについて、順番に、（ｉｉｉ）その番地に格納されているデータの数が３つ以上であるか、（ｉｖ）その番地に格納されているデータが２つで、かつ、その直前の番地に格納されているデータが２つであるか、（ｖ）その番地に格納されているデータが２つで、かつ、その番地が最後の番地であるか、（ｖｉ）その番地に格納されているデータが１つで、かつ、その番地が最後の番地で、かつ、その直前の番地に格納されているデータが２つであるか、を判定する（ステップＢ５０）。
【００５２】
この判定の結果、１番目の小規模データセットに対する仮格納用テーブルのそれ以降の全ての番地に格納されているデータについて、これらの（ｉｉｉ）〜（ｖｉ）の４つの条件をいずれも満たしていないと判定した場合、ＮＯルートへ進み、１番目の小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納することができると判定する（ステップＢ６０）。この場合、図４のフローチャートのステップＡ４０における判定の結果、ＹＥＳルートへ進むことになる。
【００５３】
一方、１番目の小規模データセットに対する仮格納用テーブルのいずれかの番地に格納されているテータについて、上述のいずれかの条件を満たしていると判定した場合、即ち、ステップＢ３０、Ｂ４０、Ｂ５０のいずれかで条件を満たしていると判定した場合、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地又は次の番地に全てのデータを格納することができないため、１番目の小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納することができないと判定する（ステップＢ７０）。この場合、図４のフローチャートのステップＡ４０における判定の結果、ＮＯルートへ進むことになる。
【００５４】
なお、ここでは、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納することができるか否かを判定する場合を例に挙げて説明しているが、これに限られるものではなく、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はこれに連続する格納位置（第２格納位置）に複数のデータの全てを格納することができるか否かを判定すれば良い。例えば、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又はこの後の複数番地（第２格納位置）に複数のデータの全てを格納することができるか否かを判定しても良い。ここで、第１格納位置としての番地からいくつ後の番地までを第２格納位置とするかは、データ検索処理時に、使用するＣＰＵにおいて、１回のロード命令の実行によってロード可能なデータサイズに応じて決めれば良い。例えば、使用するＣＰＵにおいて、各番地のデータとキーの合計サイズをｄとし、１回のロード命令（例えば、汎用レジスタに対する汎用ロード命令、又は、ＸＭＭレジスタやＹＭＭレジスタなどのＳＩＭＤ命令用レジスタに対応するＳＩＭＤロード命令）の実行によって、ＣＰＵのレジスタにロード可能なデータサイズの最大値をＤとし、ｙ番地後までを第２格納位置とする場合、ｙを０≦ｙ≦ＦＬＯＯＲ（Ｄ÷ｄ）の範囲から決定すれば良い。また、例えば、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はその前の格納位置（第２格納位置）に複数のデータの全てを格納することができるか否かを判定しても良い。
【００５５】
また、上述のように、小規模データセットについて、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される第１格納位置又はこれに連続する第２格納位置に複数のデータの全てを格納することができるか否かの判定は、候補ハッシュ関数が、小規模データセット、又は、小規模データセットに含まれる複数のデータを格納するハッシュテーブルに対して、準完全ハッシュ関数であるか否かの判定である。ここで、小規模データセットに含まれる複数のデータの全てについて、ハッシュテーブル上での実際のデータの格納位置が、あるハッシュ関数によって算出されるハッシュ値に基づいて特定される第１格納位置又はこれに連続する第２格納位置であるという条件を満たす場合、そのハッシュ関数を準完全ハッシュ関数という。また、候補ハッシュ関数が小規模データセットに対して準完全ハッシュ関数であるかの判定によって準完全ハッシュ関数として選出される確率は、上述のＣＨＤアルゴリズムのようにあるハッシュ関数が小規模データセットに対して完全ハッシュ関数であるかの判定によって完全ハッシュ関数として選出される確率よりも高い。つまり、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される第１格納位置又はこれに連続する第２格納位置にデータを格納することができるか否かを判定してハッシュ関数を選出することで、完全ハッシュ関数を選出する場合よりもハッシュ関数の選出条件を緩めることで、ハッシュ関数の選出を容易に、かつ、高速に行なうことができるようにしている。このため、各小規模データセットに対するハッシュ関数の決定を高速に行なうことが可能となる。
【００５６】
ところで、図４のステップＡ４０で、データ格納処理部２は、ハッシュ関数決定部８によって、小規模データセット毎に、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はこれに連続する格納位置（第２格納位置）に複数のデータの全てを格納することができると判定した場合、ＹＥＳルートへ進み、その小規模データセットが条件を満たしていることを示すフラグＦ、即ち、候補ハッシュ関数がその小規模データセットに対して準完全ハッシュ関数であることを示すフラグＦを「１」に設定し（Ｆ＝１；ステップＡ５０）、ステップＡ６０へ進む。
【００５７】
一方、図４のステップＡ４０で、データ格納処理部２は、ハッシュ関数決定部８によって、小規模データセット毎に、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はこれに連続する格納位置（第２格納位置）に複数のデータの全てを格納することができないと判定した場合、ＮＯルートへ進み、ステップＡ６０へ進む。この場合、フラグＦは初期設定の「０」に設定されている。
【００５８】
そして、ステップＡ６０で、ハッシュ関数が割り当てられていない全ての小規模データセットに対して、選出した候補ハッシュ関数によって、ハッシュ値を算出し、算出したハッシュ値に基づいて特定される番地（第１格納位置）又はこれに連続する番地（第２格納位置）に複数のデータの全てを格納することができるか否かを判定する、各処理を行なったか否かを判定する。
【００５９】
この段階では、ハッシュ関数が割り当てられている小規模データセットはなく、まだ１番目の小規模データセットに対する処理しか行なっていないため、ハッシュ関数が割り当てられていない全ての小規模データセットに対して各処理を行なっていないと判定し、ＮＯルートへ進み、ステップＡ３０へ戻って、２番目以降の小規模データセットに対して同様の処理（ステップＡ３０〜Ａ６０、Ｂ１０〜Ｂ７０）を繰り返す。
【００６０】
そして、ステップＡ６０で、ハッシュ関数が割り当てられていない全ての小規模データセットに対して各処理を行なったと判定した場合、ＹＥＳルートへ進む。この場合、ハッシュ関数が割り当てられていない全ての小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納することができるか否かの判定結果が得られている。
【００６１】
次に、データ格納処理部２は、ハッシュ関数決定部８によって、第１格納位置又は第２格納位置に複数のデータの全てを格納することができると判定した小規模データセットに対するハッシュ関数として候補ハッシュ関数を決定し、ハッシュ係数値表作成部９によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表２０（図６参照）を作成し、対応表作成部１０によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表２１（図６参照）を作成する（ステップＡ７０、Ａ８０）。
【００６２】
例えば、ｍ個の小規模データセットのうち、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される第１格納位置又は第２格納位置に全てのデータを格納することができると判定された小規模データセットがａ個あった場合、ｍ−ａが閾値ｔｈｄ以下の場合に、候補ハッシュ関数をハッシュ関数として採用し、ａ個の小規模データセットのそれぞれに対するハッシュ関数として割り当てる。このように、小規模データセットの総数と条件を満たした小規模データセットの数との差が小さい場合、即ち、条件を満たした小規模データセットの数が多い場合に、ハッシュ関数として採用するようにしている。これにより、できるだけ多くの小規模データセットに対して一つのハッシュ関数が割り当てられるようにしている。
【００６３】
このため、ステップＡ７０で、ｍ−ａが閾値ｔｈｄ以下であるか否かを判定し、この判定の結果、ｍ−ａが閾値ｔｈｄ以下であると判定した場合に、ＹＥＳルートへ進んで、ステップＡ８０へ進み、ＣＰＵキャッシュメモリ１１１上に作成したハッシュ係数値表、即ち、ハッシュ関数のインデックス番号とハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）とを対応づけたハッシュ関数実体管理表２０（図６参照）に、インデックス番号１に対応づけて、ハッシュ関数として採用された候補ハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）を格納する（ステップＡ８０）。また、ＣＰＵキャッシュメモリ１１１上に作成した対応表、即ち、各小規模データセットの識別番号であるＣＲＣ値とハッシュ関数のインデックス番号とを対応づけたハッシュ関数インデックス表２１（図６参照）に、ａ個の小規模データセットのそれぞれの識別番号であるＣＲＣ値に対応づけて、ａ個の小規模データセットのそれぞれに対するハッシュ関数として割り当てられたハッシュ関数のインデックス番号１を格納する（ステップＡ８０）。なお、ここでは、閾値ｔｈｄは、ｉが１≦ｉ≦１５の場合には「２１７−ｉ」とし、ｉ＝１６の場合には「０」とする。これにより、ハッシュ関数の採用条件がだんだん厳しくなるようにしている。
【００６４】
そして、ｉが「１６」であるか、即ち、ｉ＝１６であるかを判定し（ステップＡ９０）、ｉ＝１６でない場合は、ｉをインクリメントし、即ち、ｉ＝ｉ＋１とし（ステップＡ１００）、ステップＡ２０へ戻る。この段階では、ｉ＝１６でないため、ｉ＝２として、ステップＡ２０へ戻り、候補ハッシュ関数として、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数を選出する。例えば、ハッシュ係数Ｒの値を「２」として１つのハッシュ関数を選出し、これを候補ハッシュ関数とすれば良い。その後、上述と同様の処理を繰り返す。
【００６５】
一方、ステップＡ７０で、ｍ−ａが閾値ｔｈｄを超えていると判定した場合は、ＮＯルートへ進んで、候補ハッシュ関数をインデックス番号１のハッシュ関数として採用せずに、ステップＡ２０へ戻り、ｉ＝１としたまま、候補ハッシュ関数として、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数を選出する。例えば、ハッシュ係数Ｒの値を「２」として１つのハッシュ関数を選出し、これを候補ハッシュ関数とすれば良い。その後、上述と同様の処理を繰り返す。
【００６６】
その後、ステップＡ９０で、ｉ＝１６であると判定した場合、インデックス番号１〜１６の１６個のハッシュ関数が決定されたことになるため、処理を終了する。
なお、候補ハッシュ関数として、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数を選出する場合、ハッシュ係数Ｒの値を「１」から順番に大きくなるようにしても良いし、ハッシュ係数Ｒの値として１〜２５６の中の任意の値を順番に選ぶようにしても良い。但し、候補ハッシュ関数として選出され、上述の処理を行なったハッシュ関数が再度選出されることがないように、上述の処理を行なった後に（例えばステップＡ７０やステップＡ９０のＮＯルートで）、そのハッシュ関数を使用済みとするのが好ましい。これにより、ステップＡ２０で候補ハッシュ関数を選出する際に未使用のハッシュ関数が選出されるようにすることができる。また、上述のように、インデックス番号１から１６まで順番にハッシュ関数を決定していく場合、インデックス番号１のハッシュ関数を決定する処理では、全ての小規模データセットに対して、ハッシュ値を算出するなどの上述の処理を行なう必要があるが、インデックス番号２以降のハッシュ関数を決定する処理では、ハッシュ関数が割り当てられていない小規模データセットに対して、ハッシュ値を算出するなどの上述の処理を行なえば良い。また、上述のように、ｉ＝１６の場合、閾値ｔｈｄを「０」とすることで、未割り当ての全ての小規模データセットが上述のステップＡ４０の条件を満たしている場合にインデックス番号１６のハッシュ関数が決定されるようにして、ハッシュ関数が割り当てられていない小規模データセットがないようにしているが、これに限られるものではなく、ハッシュ関数が割り当てられていない小規模データセットがないようにすれば良い。例えば、閾値ｔｈｄは変化させずに一定とし、ｉ＝１６であるかの判定（ステップＡ９０）を、ステップＡ８０の前に入れ、ｉ＝１６でないと判定した場合は、ステップＡ１００へ進み、ｉ＝１６であると判定した場合は、さらに、ハッシュ関数が割り当てられていない小規模データセットがあるかを判定し、ハッシュ関数が割り当てられていない小規模データセットはないと判定したときに、ステップＡ８０へ進み、ハッシュ関数が割り当てられていない小規模データセットがあると判定したときは、ステップＡ２０へ戻り、ハッシュ関数が割り当てられていない小規模データセットがないと判定されるまで同様の処理を繰り返すようにしても良い。
【００６７】
このようにして、データ格納処理部２は、ハッシュ関数決定部８によって、使用する１６個のハッシュ関数、即ち、複数の小規模データセットに対して割り当てられるインデックス番号１〜１６の１６個のハッシュ関数を決定する。このようにして決定された１６個のハッシュ関数によってハッシュ関数プールが構成される。そして、１６個のハッシュ関数からなるハッシュ関数プールから各小規模データセットに対するハッシュ関数が割り当てられる。このため、データ格納処理部２は、ハッシュ関数決定部８によって、１６個のハッシュ関数からなるハッシュ関数プールを決定する。また、データ格納処理部２は、ハッシュ係数値表作成部９によって、インデックス番号１〜１６に、１６個のハッシュ関数のそれぞれを特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値；各値のサイズは２バイトである）を対応づけて、ＣＰＵキャッシュメモリ１１１上にハッシュ係数値表２０（図６参照）を作成する。なお、ハッシュ係数値表２０を、ハッシュ係数セットともいう。また、データ格納処理部２は、対応表作成部１０によって、複数の小規模データセットのそれぞれの識別番号であるＣＲＣ値に、１６個のハッシュ関数のインデックス番号１〜１６のうち、割り当てられたハッシュ関数のインデックス番号を対応づけて、ＣＰＵキャッシュメモリ１１１上に対応表２１（図６参照）を作成する。このように、対応表２１及びハッシュ係数値表２０（図６参照）を作成するだけで良いため、作用素の圧縮処理が必要な上述のＣＨＤアルゴリズムの場合と比較して、データの格納処理を高速に行なうことが可能である。
【００６８】
ここでは、複数の小規模データセットに割り当てられるハッシュ関数は１６個であるため、各小規模データセットのＣＲＣ値に対応づけられるハッシュ関数のインデックス番号、即ち、１６個のハッシュ関数を識別する識別子は、４ビット（固定長）で表現することができる。つまり、ｍ個の小規模データセットの場合、ｍ行１列のマトリックを用い、各行に４ビットで表現される１６個のハッシュ関数のインデックス番号のいずれかを格納することで、対応表を作成することができる。ここで、小規模データセットの数は、格納するデータの数で決まるが、例えば１つの小規模データセットに平均４つのデータが含まれるようにすると、小規模データセットの数は全データ数の４分の１となる。そして、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量は４ビットであるため、１つのデータ当たりで必要な情報量は約１ビットとなる。また、１６個のハッシュ関数を用いる場合、ハッシュ値係数表に、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値として例えばＲ１〜Ｒ８の８個の値を格納し、各値のサイズを２バイトとすると、ハッシュ値係数表のサイズは２５６バイトとなる。したがって、格納するデータの数がｎの場合、各小規模データセットにハッシュ関数を対応づけるのに必要な１つのデータ当たりの情報量は、約（ｎ＋２０４８）ビットとなる。例えば、データ１つ当たりの情報量は、ｎが１００万の場合、１．００２ｎビットとなり、ｎが１０万の場合、１．０２０ｎビットとなり、ｎが１万の場合、１．２０５ｎビットとなる（格納率約８０％）。このように、データ１つ当たりの情報量が１．６２ｎビット（格納率約８１％）、２．３ｎビット（格納率１００％）となるＣＨＤアルゴリズムと比較して、データ１つ当たりの情報量を少なくすることができ、特に、大規模なデータセットになるほど、データ１つ当たりの情報量を少なくすることができる。このため、大規模データセットを小規模データセットに分割して格納する場合に、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量を少なくできる。これにより、これをＣＰＵキャッシュメモリ１１１上に確実に保持することが可能となり、この結果、高速なデータ検索を実現することが可能となる。つまり、全ての小規模データセットに対するハッシュ関数の識別子長を短くし、メモリ使用量を削減することで、キャッシュヒット率を向上させ、データ検索の高速化を実現することが可能となる。
【００６９】
なお、ここでは、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値として例えばＲ１〜Ｒ８の８個の値を格納してハッシュ係数値表を作成しているが、これらに限られるものではなく、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値として、１個の値又は複数個の値を格納してハッシュ係数値表を作成しても良い。例えば、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてＲ１の１個の値を格納してハッシュ係数値表を作成するようにしても良いし、また、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてＲ１〜ＲＳのＳ個（Ｓ≧２）の値を格納してハッシュ係数値表を作成するようにしても良い。上述のように、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数を用いてハッシュ値を算出する場合、上述の積和式から分かるように、ハッシュ係数の値としてＲ１〜Ｒｎのｎ個の値が必要になる。このため、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値として１個の値又はｎ個よりも少ない複数の値を格納してハッシュ係数値表を作成した場合には、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているハッシュ係数の値を用いて、ハッシュ係数値表に格納されていないハッシュ係数の値を算出すれば良い。例えば、ハッシュ係数の値としてＲ１の値のみを格納してハッシュ係数値表を作成した場合、ハッシュ値を算出する際に、Ｒ１の値を用いてＲ２〜Ｒｎの値を算出すれば良い。また、ハッシュ値の計算を高速化すべく、積和演算又はベクトル演算の計算機能を備えたＣＰＵを用いて（例えばＣＰＵのＳＩＭＤ命令を用いて）、その計算機能によって上述の積和式の計算を行なうことで、あるいは、並列計算（同時並列計算）が可能なＣＰＵ（例えばマルチコアＣＰＵ、即ち、単一のＣＰＵデバイスが複数のＣＰＵユニットを持つもの）や複数のＣＰＵを用いて、上述の積和式の並列計算を行なってハッシュ値を算出する場合、使用されるＣＰＵに応じて、ハッシュ係数値表に格納しておくハッシュ係数の値の個数を決めても良い。例えば、上述の積和式をＺ個の項（掛け算からなる部分式）に分割し、例えばＣＰＵのＳＩＭＤ命令を用いて逐次計算することでハッシュ値を算出する場合、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてＲ１〜ＲＺのＺ個の値を格納してハッシュ係数値表を作成しておけば良い。例えば、上述の積和式を８個の項に分割し、これらを例えばＣＰＵのＳＩＭＤ命令を用いて逐次計算することでハッシュ値を算出する場合、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてＲ１〜Ｒ８の８個の値を格納してハッシュ係数値表を作成しておけば良い。この場合、データのキー列が｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝（ｎ≦８）の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているＲ１〜Ｒ８の８個の値を用いて、Ｒ１〜Ｒ８を含む８個の項を例えばＣＰＵのＳＩＭＤ命令を用いて逐次計算してハッシュ値���高速に算出することが可能となる。また、データのキー列が｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝（ｎ＞８）の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているＲ１〜Ｒ８の８個の値を任意に用いてＲｎ（ｎ≧９）の値を算出し、Ｒ１〜Ｒｎを含むｎ個の項を８個の項ずつ例えばＣＰＵのＳＩＭＤ命令を用いて逐次計算することで、ハッシュ値を高速に算出することが可能となる。また、例えば、上述の積和式をＺ個の項（掛け算からなる部分式）に分割し、これらを並列計算が可能なＣＰＵ又は複数のＣＰＵを用いて並列計算することでハッシュ値を算出する場合、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてＲ１〜ＲＺのＺ個の値を格納してハッシュ係数値表を作成しておけば良い。例えば、上述の積和式を８個の項に分割し、これらを並列計算が可能なＣＰＵ又は複数のＣＰＵを用いて並列計算することでハッシュ値を算出する場合、１６個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてＲ１〜Ｒ８の８個の値を格納してハッシュ係数値表を作成しておけば良い。この場合、データのキー列が｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝（ｎ≦８）の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているＲ１〜Ｒ８の８個の値を用いて、Ｒ１〜Ｒ８を含む８個の項を並列計算してハッシュ値を高速に算出することが可能となる。また、データのキー列が｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝（ｎ＞８）の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているＲ１〜Ｒ８の８個の値を任意に用いてＲｎ（ｎ≧９）の値を算出し、Ｒ１〜Ｒｎを含むｎ個の項を、８個の項ずつ並列計算することで、ハッシュ値を高速に算出することが可能となる。また、例えばＣＰＵのＳＩＭＤ命令を用いる方法と、並列計算する方法とを組み合わせることで、ハッシュ値を高速に算出することも可能である。なお、ハッシュ係数値表がＣＰＵキャッシュメモリ上に保持されるように、ＣＰＵキャッシュメモリのサイズに応じてハッシュ係数値表のサイズを決めるのが好ましい。つまり、ハッシュ係数値表がＣＰＵキャッシュメモリ上に保持されるように、ＣＰＵキャッシュメモリのサイズに応じて、ハッシュ係数値表に格納しておくハッシュ係数の値の個数を決めるのが好ましい。
【００７０】
また、ここでは、複数のハッシュ関数を決定する処理（図３のステップＳ２０）、ハッシュ係数値表を作成する処理（図３のステップＳ３０）及び対応表を作成する処理（図３のステップＳ４０）を並行して行なう場合を例に挙げて説明しているが、これに限られるものではない。例えば、複数のハッシュ関数を決定する処理を行なった後に、ハッシュ係数値表を作成する処理及び対応表を作成する処理を行なうようにしても良い。
【００７１】
次に、図３に示すように、データ格納処理部２は、ハッシュテーブル作成部（ハッシュ情報作成部）１１によって、複数のデータセットのそれぞれに対する複数のハッシュテーブル２２を作成する（ステップＳ５０）。特に、データ格納処理部２は、ハッシュテーブル作成部１１によって、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第１格納位置又は第２格納位置にデータ及びキーを格納してデータセットに対するハッシュテーブル２２を作成する。これにより、メインメモリ１０１上に複数のハッシュテーブル２２が保持され、メインメモリ１０１上に複数のハッシュテーブル２２を記憶するハッシュテーブル記憶部（ハッシュ情報記憶部）６が作成される。
【００７２】
ここでは、図７に示すように、データ格納処理部２は、ハッシュテーブル作成部１１によって、まず、小規模データセットに対するハッシュテーブル２２のサイズを決定する（ステップＣ１０）。例えば、小規模データセットに含まれるデータの数ｎ′が「４」の場合、小規模データセットに対するハッシュテーブル２２のサイズを例えばＲＯＵＮＤ（ｎ′÷０．８）で「５」に決定すれば良い。これにより、小規模データセットのサイズに基づいてハッシュテーブル２２のサイズを決定することで、小規模データセットに対するハッシュテーブル２２のデータ格納率を約８０％にすることができる。
【００７３】
次に、データ格納処理部２は、ハッシュテーブル作成部１１によって、各小規模データセットに対するハッシュテーブル２２を作成し、メインメモリ１０１に格納する（ステップＣ２０〜Ｃ８０）。つまり、各小規模データセットに対するハッシュテーブル２２として、上述のようにして決定したサイズのハッシュテーブル２２をメインメモリ１０１上に作成し、これに、各小規模データセットに含まれる各データのキーを用いて各小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される第１格納位置又は第２格納位置に各データ及び各キーを格納することで、各小規模データセットに対するハッシュテーブル２２を作成する。
【００７４】
例えば、上述のデータ格納処理部２のハッシュ関数決定部８による処理において作成された各小規模データセットに対する仮格納用テーブルを用いて、各小規模データセットに対するハッシュテーブル２２を作成すれば良い。なお、ここでは、各小規模データセットについて、各小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納してハッシュテーブル２２を作成することになる。また、ここでは、１番目の小規模データセットに対する１番目のハッシュテーブル２２から１６番目の小規模データセットに対する１６番目のハッシュテーブル２２まで、１６個のハッシュテーブル２２を順番に作成する場合を例に挙げて説明する。
【００７５】
つまり、まず、図７に示すように、データ格納処理部２は、ハッシュテーブル作成部１１によって、ハッシュテーブル２２の対応する番地に既にデータが格納されているかを判定し（ステップＣ２０）、まだデータが格納されていない場合には、ＮＯルートへ進み、仮格納用テーブルに格納されているデータを、ハッシュテーブルの対応する番地に格納し（ステップＣ３０）、既に格納されている場合には、ＹＥＳルートへ進み、仮格納用テーブルに格納されているデータを、ハッシュテーブルの対応する番地の次の番地に格納する（ステップＣ８０）。
【００７６】
この段階は、１番目の小規模データセットに対する仮格納用テーブルの最初の番地（行）に格納されている１つ目のデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の最初の番地（行）に格納する段階であり、まだデータは格納されていないため、ＮＯルートへ進み、１番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されている１つ目のデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の最初の番地に格納する（ステップＣ３０）。
【００７７】
次に、データ格納処理部２は、ハッシュテーブル作成部１１によって、仮格納用テーブルの一の番地に２つのデータが格納されているか否かを判定し（ステップＣ４０）、仮格納用テーブルの一の番地に２つのデータが格納されている場合には、ＹＥＳルートへ進み、２つ目のデータを、ハッシュテーブル２２の対応する番地の次の番地に格納し（ステップＣ５０）、仮格納用テーブルの一の番地に２つのデータが格納されていない場合には、ＮＯルートへ進んで、ステップＳ６０へ進む。
【００７８】
この段階では、１番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータが２つあるか判定し（ステップＣ４０）、１番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータが２つある場合には、ＹＥＳルートへ進み、２つ目のデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の２番目の番地に格納する（ステップＣ５０）。一方、１番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータが２つない場合は、ＮＯルートへ進んで、ステップＣ６０へ進む。
【００７９】
次に、データ格納処理部２は、ハッシュテーブル作成部１１によって、仮格納用テーブルに格納されている全てのデータを、メインメモリ１０１上のハッシュテーブル２２に格納したか否かを判定し（ステップＣ６０）、全てのデータを格納していないと判定した場合は、ＮＯルートへ進んで、ステップＣ２０へ戻り、同様の処理を繰り返す。
この段階では、全てのデータを格納していないため、ステップＣ２０へ戻る。そして、この段階は、１番目の小規模データセットに対する仮格納用テーブルの２番目の番地に格納されている１つ目のデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の２番目の番地に格納する段階であるため、ステップＣ２０で、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の２番目の番地に既にデータが格納されているか否かを判定する（ステップＣ２０）。
【００８０】
この判定の結果、まだデータが格納されていないと判定した場合は、ＮＯルートへ進んで、１番目の小規模データセットに対する仮格納用テーブルの２番目の番地に格納されている１つ目のデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の２番目の番地に格納する（ステップＣ３０）。そして、１番目の小規模データセットに対する仮格納用テーブルの２番目の番地に格納されているデータが２つあるか判定し（ステップＣ４０）、１番目の小規模データセットに対する仮格納用テーブルの２番目の番地に格納されているデータが２つある場合には、ＹＥＳルートへ進み、２つ目のデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の３番目の番地に格納する（ステップＣ５０）。一方、１番目の小規模データセットに対する仮格納用テーブルの２番目の番地に格納されているデータが２つない場合は、ＮＯルートへ進んで、ステップＣ６０へ進む。
【００８１】
一方、ステップＣ２０で既にデータが格納されていると判定した場合は、ＹＥＳルートへ進んで、１番目の小規模データセットに対する仮格納用テーブルの２番目の番地に格納されている１つ目のデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の３番目の番地に格納する（ステップＣ８０）。
以後、同様の処理を繰り返して、１番目の小規模データセットに対する仮格納用テーブルの３番目以降の番地に格納されているデータを、メインメモリ１０１上の１番目の小規模データセットに対する１番目のハッシュテーブル２２の対応する番地又はその次の番地に格納する。
【００８２】
そして、ステップＣ６０で、全てのデータを格納したと判定した場合は、ＹＥＳルートへ進み、さらに、全ての小規模データセットに対するハッシュテーブル２２を作成したか否かを判定する（ステップＣ７０）。この判定の結果、全ての小規模データセットに対するハッシュテーブル２２を作成したと判定した場合は、処理を終了し、全ての小規模データセットに対するハッシュテーブル２２を作成していないと判定した場合は、ＮＯルートへ進んで、ステップＣ１０へ戻り、同様の処理を繰り返す。
【００８３】
この段階は、１番目の小規模データセットに対する１番目のハッシュテーブル２２として、１番目の小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納したハッシュテーブル２２を、メインメモリ１０１上に作成した段階であるため、ステップＣ７０で、全ての小規模データセットに対するハッシュテーブル２２を作成していないと判定し、ＮＯルートへ進んで、ステップＣ１０へ戻り、同様の処理を繰り返して、２番目以降の小規模データセットに対する２番目以降のハッシュテーブル２２を、メインメモリ１０１上に作成する。
【００８４】
そして、ステップＣ７０で、全ての小規模データセットに対するハッシュテーブル２２を作成したと判定した場合は、処理を終了する。
これにより、各小規模データセットに対する各ハッシュテーブル２２として、各小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納したハッシュテーブル２２を、メインメモリ１０１上に作成することができる。このような準完全ハッシュ関数に基づいて作成されるハッシュテーブル２２は、データがハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納されていることを保証する。このため、後述するように、データ検索時には、これらの番地に格納されているデータを一度に読み出し、どちらの番地にデータが格納されているかを判定すれば良いため、完全ハッシュ関数を用いる場合と比較して、データ検索効率の低下を抑えることができる。つまり、上述のように、完全ハッシュ関数を選出する場合よりもハッシュ関数の選出条件を緩めることで、ハッシュ関数の選出を容易に、かつ、高速に行なうことができるようにしながら、完全ハッシュ関数を用いる場合と比較して、データ検索効率の低下を抑えることができる。
【００８５】
なお、ここでは、上述のデータ格納処理部２のハッシュ関数決定部８による処理において作成された各小規模データセットに対する仮格納用テーブルを用いて、各小規模データセットに対するハッシュテーブル２２を作成しているが、これに限られるものではない。例えば、図８に示すように、データ格納処理部２は、ハッシュテーブル作成部１１によって、小規模データセットに対するハッシュテーブル２２のサイズを決定し（ステップＤ１０）、小規模データセットの識別番号であるＣＲＣ値を用いて対応表２１（図６参照）からインデックス番号を取得し（ステップＤ２０）、取得したインデックス番号を用いてハッシュ係数値表２０（図６参照）から小規模データセットに割り当てられたハッシュ関数を特定するハッシュ係数の値を取得し（ステップＤ３０）、これを用いて小規模データセットに割り当てられたハッシュ関数によって小規模データセットに含まれる各データのキーに基づいてハッシュ値を算出し（ステップＤ４０）、このハッシュ値を小規模データセットに対するハッシュテーブル２２のサイズで割った余りの値を算出し（ステップＤ５０）、この余りの値が小さい順に、上述と同様に、メインメモリ１０１上の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて（ここではハッシュ値に基づいて算出される余りの値によって）特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、各小規模データセットに対するハッシュテーブルを作成し（ステップＤ６０）、ステップＤ７０で、全ての小規模データセットに対するハッシュテーブル２２を作成したと判定するまで同様の処理を繰り返すようにしても良い。なお、ここでは、ハッシュテーブル２２のサイズを最初に決めているが、これに限られるものではなく、この処理（ステップＤ１０）は、少なくともハッシュテーブル２２にデータを格納する処理（ステップＤ６０）を行なう前に行なえば良い。
【００８６】
なお、ここでは、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納してハッシュテーブル２２を作成する場合を例に挙げて説明しているが、これに限られるものではなく、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はこれに連続する格納位置（第２格納位置）に複数のデータの全てを格納してハッシュテーブルを作成すれば良い。例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又はこの後の複数番地（第２格納位置）に複数のデータの全てを格納してハッシュテーブルを作成しても良い。ここで、第１格納位置としての番地からいくつ後の番地までを第２格納位置とするかは、データ検索処理時に、使用するＣＰＵにおいて、１回のロード命令の実行によってロード可能なデータサイズに応じて決めれば良い。例えば、使用するＣＰＵにおいて、各番地のデータとキーの合計サイズをｄとし、１回のロード命令（例えば、汎用レジスタに対する汎用ロード命令、又は、ＸＭＭレジスタやＹＭＭレジスタなどのＳＩＭＤ命令用レジスタに対応するＳＩＭＤロード命令）の実行によって、ＣＰＵのレジスタにロード可能なデータサイズの最大値をＤとし、ｙ番地後までを第２格納位置とする場合、ｙを０≦ｙ≦ＦＬＯＯＲ（Ｄ÷ｄ）の範囲から決定すれば良い。ここで、ｙの値に大きい値を選ぶと、あるハッシュ関数が準完全ハッシュ関数である確率が高まるためにハッシュ関数を決定する処理が容易になり、かつ、大量のデータを格納する際に用いるハッシュ関数の数をより少なくすることが可能となる。なお、ｙの値に大きい値を選ぶと、データ検索時に、検索対象データを見つけ出すか又は検索対象データが格納されていないと判定するまでに要する時間（ＣＰＵ時間）がおよそ数ナノ秒から数十ナノ秒ほど長くなる。例えば、このような判定に要するＣＰＵ時間は平均してｙ／２クロック程度である。このため、ｙの値に大きい値を選ぶことで上述の判定に要する時間が長くなっても、これが検索処理能力に与える影響は無視できるほど小さい。ここで、また、例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はその前の格納位置（第２格納位置）に複数のデータの全てを格納してハッシュテーブル２２を作成しても良い。
【００８７】
次に、本データ検索装置１に備えられるデータ検索処理部３による処理、即ち、本データ検索装置１においてＣＰＵ１０２がメインメモリ１０１に読み込まれたデータ検索プログラムに従って実行する処理（データ検索方法）について、図９を参照しながら説明する。
ここでは、データ検索処理部３は、データの検索依頼を受けると、以下の手順で、メインメモリ１０１上の複数のハッシュテーブル２２に対してデータ検索を行なう。
【００８８】
まず、図９に示すように、データ検索処理部３は、ハッシュテーブル特定部（ハッシュ情報特定部）１２によって、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル２２の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル２２を特定する（ステップＥ１０）。
【００８９】
ここでは、データ検索処理部３は、検索対象データのキーを受けとったら、ハッシュテーブル特定部１２によって、検索対象データのキーのＣＲＣ３２値を計算し、算出されたＣＲＣ３２値を小規模データセットの数ｍで割った余りの値（ＣＲＣ値）を算出する。このようにして検索対象データのキーに基づいて算出したＣＲＣ値は、ｎ個のデータを含む大規模データセットを分割したｍ個の小規模データセットの識別番号、即ち、ｍ個の小規模データセットのそれぞれを格納するｍ個のハッシュテーブルの識別番号として用いることができる。このため、上述のようにして検索対象データのキーに基づいて算出したＣＲＣ値によって、ｍ個のハッシュテーブルの中から、検索対象データを含むデータセットを格納するハッシュテーブルを特定することができる。つまり、検索対象データのキーに基づいて、検索対象データを含むデータセットを格納するハッシュテーブルの識別番号（識別子）を取得することができる。例えば、ＳＳＥ４．２拡張命令セットをサポートするＣＰＵを用いる場合、ハードウェア的に組み込まれたＣＲＣ３２ｃ演算命令（組み込み関数名：ｃｒｃ３２）を用いて高速に検索対象データを含むデータセットを格納するハッシュテーブルを特定することができる。
【００９０】
次に、データ検索処理部３は、ハッシュ係数値取得部１３によって、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表２１（図６参照）及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表２０（図６参照）を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する（ステップＥ２０、Ｅ３０）。
【００９１】
ここでは、データ検索処理部３は、ハッシュ係数値取得部１３によって、上述のようにして検索対象データのキーに基づいて算出したＣＲＣ値を使って、ＣＰＵキャッシュメモリ１１１上の対応表２１（図６参照）を用いて、インデックス番号を取得し（ステップＥ２０）、このインデックス番号を用いて、ＣＰＵキャッシュメモリ１１１上のハッシュ係数値表２２（図６参照）から、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）を取得する（ステップＥ３０）。このようにして、検索対象データを含むデータセットを格納するハッシュテーブル２２に割り当てられたハッシュ関数（準完全ハッシュ関数）を特定するハッシュ係数の値をＣＰＵキャッシュメモリ１１１から取得する。このように、対応表２１及びハッシュ係数値表２０（図６参照）は、いずれもＣＰＵキャッシュメモリ１１１上にあるため、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値へのアクセスを高速化することができる。また、インデックス番号は４ビットの固定長（４ビット固定長エントリ）で構成されているため、先頭アドレス＋インデックス番号×４ビットという四則演算で所望のハッシュ係数の値が格納されている物理位置にアクセス可能なので、アクセスの高速化を図ることができる。これにより、検索対象データを含むデータセットを格納するハッシュテーブル２２上のデータ位置の特定を高速に行なうことが可能となる。
【００９２】
次に、データ検索処理部３は、ハッシュ値計算部１４によって、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する（ステップＥ４０）。
ここでは、データ検索処理部３は、ハッシュ値計算部１４によって、検索対象データのキー、及び、上述のようにして取得した、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）を用いて、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数によってハッシュ値を計算する（ステップＥ４０）。そして、算出したハッシュ値を、検索対象データを含むデータセットに対するハッシュテーブルのサイズ（ここでは５）で割った余りの値を算出する（ステップＥ５０）。なお、ハッシュ値の計算は、上述のデータ格納処理部２のハッシュ関数決定部８におけるハッシュ値の計算と同様に行なえば良い。このように、単一のハッシュ関数ｆＲ（ｘ）によってハッシュ値を計算するため、ｆ１（ｘ）＋αｆ２（ｘ）＋βで表される完全ハッシュ関数によってハッシュ値を計算する、即ち、２つのハッシュ関数ｆ１（ｘ）、ｆ２（ｘ）の計算を必要とする、上述のＣＨＤアルゴリズムと比較して、ハッシュ値の計算を高速に行なうことができる。
【００９３】
次に、データ検索処理部３は、読出部１５によって、一のハッシュテーブル２２から、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出す（ステップＥ６０）。このように、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出すため、完全ハッシュ関数を用いる場合と比較して、データ検索効率の低下を抑えることができる。
【００９４】
ここでは、データ検索処理部３は、読出部１５によって、上述のようにして検索対象データのキーに基づいて算出したＣＲＣ値によって特定されたハッシュテーブル２２から、上述のようにして算出したハッシュ値をハッシュテーブルのサイズで割った余りの値によって特定される番地（第１格納位置）及び次の番地（第２格納位置）に格納されているデータ及びキーをメインメモリ１０１（又はＣＰＵキャッシュメモリ１１１）から読み出す（ステップＥ６０）。
【００９５】
なお、ここでは、上述のように、ハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に複数のデータの全てを格納したハッシュテーブル２２を、メインメモリ１０１上に作成するようにしているため、ハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納されているデータ及びキーを読み出す場合を例に挙げて説明しているが、これに限られるものではなく、上述のデータ格納処理部２のハッシュテーブル作成部１１によって作成されたハッシュテーブル２２に応じて、ハッシュ値に基づいて特定される格納位置（第１格納位置）又はこれに連続する格納位置（第２格納位置）に格納されているデータ及びキーを読み出せば良い。例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地（第１格納位置）又はこの後の複数番地（第２格納位置）に複数のデータの全てを格納してハッシュテーブル２２を作成した場合には、ハッシュ値に基づいて特定される番地（第１格納位置）又はこの後の複数番地（第２格納位置）に格納されているデータ及びキーを読み出せば良い。ここで、第１格納位置としての番地からいくつ後の番地までを第２格納位置とするかは、使用するＣＰＵにおいて、１回のロード命令の実行によってロード可能なデータサイズに応じて決めれば良い。例えば、使用するＣＰＵにおいて、各番地のデータとキーの合計サイズをｄとし、１回のロード命令（例えば、汎用レジスタに対する汎用ロード命令、又は、ＸＭＭレジスタやＹＭＭレジスタなどのＳＩＭＤ命令用レジスタに対応するＳＩＭＤロード命令）の実行によって、ＣＰＵのレジスタにロード可能なデータサイズの最大値をＤとし、ｙ番地後までを第２格納位置とする場合、ｙを０≦ｙ≦ＦＬＯＯＲ（Ｄ÷ｄ）の範囲から決定すれば良い。また、例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置（第１格納位置）又はその前の格納位置（第２格納位置）に複数のデータの全てを格納してハッシュテーブル２２を作成した場合には、ハッシュ値に基づいて特定される格納位置（第１格納位置）又はその前の格納位置（第２格納位置）に格納されているデータ及びキーを読み出せば良い。
【００９６】
次に、データ検索処理部３は、出力部１６によって、第１格納位置又は第２格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する（ステップＥ７０〜Ｅ１１０）。
ここでは、データ検索処理部３は、出力部１６によって、上述のようにしてハッシュ値に基づいて特定される番地（第１格納位置）及び次の番地（第２格納位置）から読み出したキーが、検索対象データのキーと一致するかを判定する。つまり、まず、ハッシュ値に基づいて特定される番地から読み出したキーが、検索対象データのキーと一致するかを判定し（ステップＥ７０）、次に、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーが、検索対象データのキーと一致するかを判定する（ステップＥ９０）。これらの判定の結果、ハッシュ値に基づいて特定される番地から読み出したキーが、検索対象データのキーと一致すると判定した場合は、ハッシュ値に基づいて特定される番地から読み出したキーに対応づけられているデータを、検索対象データとして出力する（ステップＥ８０）。また、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーが、検索対象データのキーと一致すると判定した場合は、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーに対応づけられているデータを、検索対象データとして出力する（ステップＥ１００）。さらに、ハッシュ値に基づいて特定される番地から読み出したキー、及び、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーが、いずれも、検索対象データのキーと一致しないと判定した場合は、検索失敗メッセージ（エラーメッセージ）を出力する（ステップＥ１１０）。
【００９７】
したがって、本実施形態にかかるデータ検索装置、データ格納方法及びデータ検索方法によれば、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。
特に、上述のように、本実施形態にかかるデータ検索装置、データ格納方法及びデータ検索方法では、上述の準完全ハッシュ関数を用いて少数のハッシュ関数を再利用し、上述の対応表２１及びハッシュ係数値表２０（図６参照）を用いることで、データ検索効率を低下させずに、データ格納効率を下げずに、ハッシュ関数によってハッシュ値を計算する際にＣＰＵキャッシュメモリ１１１へのアクセスだけで済むようにしてデータ検索速度を向上させることができるという利点がある。
【００９８】
つまり、上述のように、大規模データセットに対して完全ハッシュ関数を算出する場合の算出コストを抑える方法として、大規模データセットを複数の小規模データセットに分割し、複数の小規模データセットのそれぞれに対して個別の完全ハッシュ関数を算出するＣＨＤアルゴリズムがある。
しかしながら、ＣＨＤアルゴリズムでは、小規模データセットの数に応じた数の完全ハッシュ関数を用いることになり、データセットが大規模になるほど、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量が増大し、メモリ領域を多く使用することになる。この場合、読み出し速度の速いＣＰＵキャッシュメモリに全体を格納するのが困難となる。このため、ハッシュ関数によってハッシュ値を計算する際に、一定の確率でメインメモリへのアクセスが発生し、メインメモリへのアクセスはＣＰＵキャッシュメモリへのアクセスと比較して数十倍から数百倍低速であるため、結果的に、データ検索速度が低下してしまう。
【００９９】
また、上述のように、上述のＣＨＤアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数として、２つのハッシュ関数ｆ１（ｘ）、ｆ２（ｘ）と２つの作用素α、βによって規定される完全ハッシュ関数、即ち、式ｘ＝ｆ１（ｘ）＋αｆ２（ｘ）＋βを決め、これを用いてハッシュ値ｘを算出する。そして、この完全ハッシュ関数によって求められたハッシュ値に基づいてデータを格納してハッシュテーブルを作成することになる。しかしながら、この完全ハッシュ関数の決定、ハッシュ値の算出及びハッシュテーブルの作成には時間がかかる。このため、データの格納に時間がかかり、データ格納速度が遅くなる。
【０１００】
また、上述のＣＨＤアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数の作用素α、βをそれぞれ圧縮して保持し、データ検索時に圧縮された各作用素α、βを伸長して元の作用素とする。そして、この元の作用素を用いて上述の完全ハッシュ関数によってハッシュ値を算出し、算出されたハッシュ値を用いてデータを検索することになる。しかしながら、このハッシュ値の算出には時間がかかる。このため、データの検索に時間がかかり、データ検索速度が遅くなる。
【０１０１】
これに対し、データ検索速度を向上させるためには、少数のハッシュ関数を再利用することで、即ち、一つのハッシュ関数を一つの小規模データセットに割り当てるのに代えて一つのハッシュ関数を複数の小規模データセットに割り当てることで、使用するハッシュ関数の数を減らし、情報量を低減することが考えられる。
しかしながら、ＣＨＤアルゴリズムのようにハッシュ関数として完全ハッシュ関数を用いる限り、それほどハッシュ関数の数を減らすことができず、情報量を十分に低減するのは難しい。つまり、情報量を十分に削減するためには、使用するハッシュ関数の数を数十以下にすることが必要である。しかし、あるハッシュ関数が所与の小規模データセットに対する完全ハッシュ関数である確率は非常に低いため、数十以下のハッシュ関数から全ての小規模データセットの完全ハッシュ関数を選出するのは困難である。このため、ハッシュ関数として完全ハッシュ関数を用いる限り、情報量を十分に低減できるほど、使用するハッシュ関数の数を減らすのは難しい。
【０１０２】
この場合、ハッシュ関数として不完全ハッシュ関数を用いれば、使用するハッシュ関数の数を減らし、情報量を低減することができる。しかしながら、ハッシュ関数として不完全ハッシュ関数を用いると、データ検索効率が低下してしまう。
また、例えば１０個のデータを格納できるサイズのハッシュテーブルに８個のデータを格納する代わりに７個のデータを格納するなど、ハッシュテーブルの格納率を下げることで、あるハッシュ関数が所与の小規模データセットに対する完全ハッシュ関数である確率を高め、使用するハッシュ関数の数を減らし、情報量を低減することも考えられる。しかしながら、データの格納効率が低下してしまう。そして、格納効率の低いハッシュテーブルを用いると、メモリ使用量を圧迫することになる。
【０１０３】
そこで、本実施形態にかかるデータ検索装置、データ格納方法及びデータ検索方法では、上述の準完全ハッシュ関数を用いて少数のハッシュ関数を再利用し、上述の対応表２１及びハッシュ係数値表２０（図６参照）を用いることで、データ検索効率を低下させずに、データ格納効率を下げずに、ハッシュ関数によってハッシュ値を計算する際にＣＰＵキャッシュメモリ１１１へのアクセスだけで済むようにしてデータ検索速度を向上させることができるようにしている。つまり、完全ハッシュ関数と比較して同等のデータ検索効率を維持し、上述のＣＨＤアルゴリズムと比較して同等のデータ格納効率を維持しながら、ハッシュ関数の再利用性を大幅に改善する準完全ハッシュ関数を用い、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量を削減することでキャッシュヒット率を高め、データ検索の高速化を実現することが可能となる。
【０１０４】
なお、本実施形態では、１６個のハッシュ関数を用いる場合を例に挙げて説明しているが、これに限られるものではない。例えば、３２個のハッシュ関数を用いても良い。この場合、３２個のハッシュ関数を識別する識別子（インデックス番号）は、５ビットで表現することになるため、対応表に必要な情報量は、１６個のハッシュ関数を用いる場合と比較して約２５％増加する。しかし、この程度の増加であれば、ＣＰＵキャッシュメモリ上に保持することが可能であるため、高速なデータ検索を実現することが可能である。一方、使用するハッシュ関数の数を増やすと、ハッシュ関数を決定する処理は高速となる。これは、上述の実施形態の閾値ｔｈｄを超えているか否かの判定においてハッシュ関数として採用される可能性が高くなり、試行回数が減るためである。例えば、格納するデータの数が５０万を超える場合には、３２個のハッシュ関数を用いるのが好ましい。なお、使用するハッシュ関数の数を８個以下とすると、上述の実施形態の閾値ｔｈｄを超えているか否かの判定においてハッシュ関数として採用することが極端に困難となるため、使用するハッシュ関数の数は１６個以上とするのが好ましい。ここで、使用するハッシュ関数の数をｐとした場合、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量はｃｅｉｌ（ｌｏｇ（ｐ））となる。このため、ｐを変えた場合、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量はｌｏｇ（ｐ）に比例して変化する。このため、キャッシュヒット率を向上させ、データ検索の高速化を図るためには、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量（特に対応表に必要な情報量）が、ＣＰＵキャッシュメモリのサイズに応じたものとなるように、使用するハッシュ関数の数を決めることになる。
【０１０５】
また、上述の実施形態のデータ検索装置、データ格納方法及びデータ検索方法は、例えば、完全一致検索、最長一致文字列検索などに用いることができる。ここで、完全一致検索としては、例えば、商品番号、型番号、店舗のバーコード、従業員番号、国番号、メールアドレスなどの一意なＩＤとの照合に用いられるものである。また、最長一致文字列検索は、例えば、字句解析及び構文解析（例えばコンパイラーなど）、形態素解析（例えば文字入力装置（ＩＭＥ）における変換処理など）、ＩＰ通信におけるルーティングテーブル探索、電話網におけるルーティングテーブル探索、貨物輸送における郵便番号などによる荷物の行き先振り分け、辞書方式のデータ圧縮における辞書への最長一致検索などに用いられるものである。
【０１０６】
以下、最初に、完全一致検索の一例として従業員ＩＤ検索システムに、上述の実施形態のデータ検索装置、データ格納方法及びデータ検索方法を適用した場合を例に挙げて説明し、次いで、最長一致文字列検索の一例として辞書式データ圧縮システムに、データ検索装置、データ格納方法及びデータ検索方法を適用した場合を例に挙げて説明する。
［完全一致検索の一例としての従業員ＩＤ検索システム］
ここで、データ検索装置としての従業員ＩＤ検索システムは、従業員ＩＤからその従業員ＩＤを持つ従業員の氏名を検索するシステムである。
【０１０７】
この従業員ＩＤ検索システムは、図１０に示すようなデータセットの格納依頼を受けると、このデータセットを、以下の手順で、メインメモリ１０１上に作成されるハッシュテーブル２２に格納する。
まず、従業員ＩＤ検索システムのデータ格納処理部２は、図１０に示すような格納対象のデータセットを受けとったら、データ分割部７によって、図１２に示すように、格納対象のデータセットを複数のデータセットに分割する。
【０１０８】
ここでは、データ格納処理部２は、データ分割部７によって、図１１に示すように、格納対象のデータセットを構成する複数のデータのそれぞれのキーのＣＲＣ３２値を計算し、算出された各ＣＲＣ３２値を小規模データセットの数（ここでは５）で割った余りの値（ＣＲＣ値）を算出する。そして、算出されたＣＲＣ値が同じデータが同じ小規模データセットに含まれるように、図１２に示すように、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。つまり、算出されたＣＲＣ値を、複数の小規模データセットの識別番号（データセット番号）として用い、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。例えば、ＳＳＥ４．２拡張命令セットをサポートするＣＰＵを用いる場合、ハードウェア的に組み込まれたＣＲＣ３２ｃ演算命令（組み込み関数名：ｃｒｃ３２）を用いて高速に複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割することができる。
【０１０９】
次に、データ格納処理部２は、ハッシュ関数決定部８によって、図１３に示すように、複数の小規模データセットのそれぞれに対する複数のハッシュ関数を決定する。
次に、データ格納処理部２は、ハッシュ係数値表作成部９（ハッシュ関数実体管理表作成部）によって、図１４に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表（ハッシュ関数実体管理表）を作成する。
【０１１０】
次に、データ格納処理部２は、対応表作成部１０（ハッシュ関数インデックス表作成部）によって、図１５に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表（ハッシュ関数インデックス表）を作成する。
次に、データ格納処理部２は、ハッシュテーブル作成部１１によって、複数のデータセットのそれぞれに対する複数のハッシュテーブル２２を作成する。
【０１１１】
ここでは、データ格納処理部２は、ハッシュテーブル作成部１１によって、まず、各小規模データセットに対応するハッシュテーブル２２のサイズを決定する。例えば、各小規模データセットに含まれるデータの数ｎ′が「４」の場合、各小規模データセットに対するハッシュテーブルのサイズをＲＯＵＮＤ（ｎ′÷０．８）で「５」に決定すれば良い。これにより、各小規模データセットのサイズに基づいてハッシュテーブル２２のサイズを決定することで、各小規模データセットに対するハッシュテーブル２２のデータ格納率を約８０％にすることができる。
【０１１２】
次に、データ格納処理部２は、ハッシュテーブル作成部１１によって、各小規模データセットに対するハッシュテーブル２２を作成し、メインメモリ１０１に格納する。
ここでは、小規模データセットの識別番号であるＣＲＣ値を用いて対応表から取得したインデックス番号を用いて、ハッシュ係数値表から、小規模データセットに割り当てられたハッシュ関数を特定するハッシュ係数の値を取得し、これを用いて小規模データセットに割り当てられたハッシュ関数によって小規模データセットに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値を小規模データセットに対するハッシュテーブルのサイズで割った余りの値を算出し、この余りの値が小さい順に、メインメモリ上の小規模データセットに対するハッシュテーブルのハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、各小規模データセットに対するハッシュテーブルを作成する。
【０１１３】
具体的には、識別番号（データセット番号）が「０」、即ち、ＣＲＣ値が「０」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「０」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは５）で割った余りの値を算出すると、図１６に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「０」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「０」の小規模データセットに対するハッシュテーブル２２を作成すると、図１７に示すようになる。
【０１１４】
同様に、識別番号（データセット番号）が「１」、即ち、ＣＲＣ値が「１」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「１」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは５）で割った余りの値を算出すると、図１８に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「１」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「１」の小規模データセットに対するハッシュテーブル２２を作成すると、図１９に示すようになる。
【０１１５】
また、同様に、識別番号（データセット番号）が「２」、即ち、ＣＲＣ値が「２」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「２」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは５）で割った余りの値を算出すると、図２０に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「２」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「２」の小規模データセットに対するハッシュテーブル２２を作成すると、図２１に示すようになる。
【０１１６】
また、同様に、識別番号（データセット番号）が「３」、即ち、ＣＲＣ値が「３」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「３」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは５）で割った余りの値を算出すると、図２２に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「３」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「３」の小規模データセットに対するハッシュテーブル２２を作成すると、図２３に示すようになる。
【０１１７】
また、同様に、識別番号（データセット番号）が「４」、即ち、ＣＲＣ値が「４」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「４」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは５）で割った余りの値を算出すると、図２４に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「４」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「４」の小規模データセットに対するハッシュテーブル２２を作成すると、図２５に示すようになる。
【０１１８】
ところで、この従業員ＩＤ検索システムは、データの検索依頼を受けると、以下の手順で、メインメモリ１０１上の複数のハッシュテーブル２２に対してデータ検索を行なう。
ここでは、検索対象データのキーとして従業員ＩＤ「０１１０」を受け取った場合を例に挙げて説明する。
まず、図２６に示すように、従業員ＩＤ検索システムのデータ検索処理部３は、ハッシュテーブル特定部１２によって、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル２２の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル２２を特定する。
【０１１９】
ここでは、データ検索処理部３は、検索対象データのキーとして従業員ＩＤ「０１１０」を受けとったら（ステップＦ１０）、ハッシュテーブル特定部１２によって、検索対象データのキーとしての従業員ＩＤ「０１１０」のＣＲＣ３２値を計算し（ステップＦ２０）、算出されたＣＲＣ３２値（ここでは「０ｘ１４４２９ｆ０４」）を小規模データセットの数（ここでは「５」）で割った余りの値（ＣＲＣ値；ここでは「４」）を算出する（ステップＦ３０）。
【０１２０】
次に、データ検索処理部３は、ハッシュ係数値取得部１３によって、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表（図１５参照）及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表（図１４参照）を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する（ステップＦ４０、Ｆ５０）。
【０１２１】
ここでは、データ検索処理部３は、ハッシュ係数値取得部１３によって、上述のようにして検索対象データのキーに基づいて算出したＣＲＣ値（ここでは「４」）を使って、ＣＰＵキャッシュメモリ１１１上の対応表（図１５参照）を用いて、インデックス番号（ここでは「６」）を取得し（ステップＦ４０）、このインデックス番号（ここでは「６」）を用いて、ＣＰＵキャッシュメモリ１１１上のハッシュ係数値表（図１４参照）から、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）を取得する（ステップＦ５０）。
【０１２２】
次に、データ検索処理部３は、ハッシュ値計算部１４によって、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する（ステップＦ６０）。
ここでは、データ検索処理部３は、ハッシュ値計算部１４によって、検索対象データのキー（ここでは従業員ＩＤ「０１１０」）、及び、上述のようにして取得した、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）を用いて、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数によってハッシュ値を計算する（ステップＦ６０）。そして、算出したハッシュ値を、検索対象データを含むデータセットに対するハッシュテーブル２２のサイズ（ここでは「５」）で割った余りの値を算出し、この余りの値として「１」を得る（ステップＦ６０）。
【０１２３】
次に、データ検索処理部３は、読出部１５によって、一のハッシュテーブル２２から、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出す（ステップＦ７０）。
ここでは、データ検索処理部３は、読出部１５によって、上述のようにして検索対象データのキーに基づいて算出したＣＲＣ値（ここでは「４」）によって特定されたハッシュテーブル（４番目のハッシュテーブル）２２から、上述のようにして算出したハッシュ値をハッシュテーブル２２のサイズで割った余りの値（ここでは「１」）によって特定される番地（第１格納位置；ここでは「１」）及び次の番地（第２格納位置；ここでは「２」）に格納されているデータ及びキーをメインメモリ１０１から読み出す（ステップＦ７０）。
【０１２４】
次に、データ検索処理部３は、出力部１６によって、第１格納位置又は第２格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する（ステップＦ８０〜Ｆ１００）。
ここでは、データ検索処理部３は、出力部１６によって、まず、ハッシュ値に基づいて特定される番地（ここでは「１」）から読み出したキー（ここでは「０１０６」）が、検索対象データのキー（ここでは「０１１０」）と一致するかを判定し（ステップＦ８０）、次に、ハッシュ値に基づいて特定される番地の次の番地（ここでは「２」）から読み出したキー（ここでは「０１１０」）が、検索対象データのキー（ここでは「０１１０」）と一致するかを判定する（ステップＦ９０）。これらの判定の結果、ハッシュ値に基づいて特定される番地の次の番地（ここでは「２」）から読み出したキーが、検索対象データのキーと一致すると判定し、ハッシュ値に基づいて特定される番地の次の番地（ここでは「２」）から読み出したキー（ここでは「０１１０」）に対応づけられているデータ（ここでは「山本聡」）を得て（ステップＦ９０）、検索対象データとして出力する（ステップＦ１００）。
【０１２５】
したがって、このような従業員ＩＤ検索システムに上述のデータ検索装置を適用することで、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。
［最長一致文字列検索の一例としての辞書式データ圧縮システム］
ここで、辞書式データ圧縮システムでは、上述のデータ検索装置１（データ格納方法及びデータ検索方法）をデータ圧縮のための辞書として用い、これに文字列（圧縮文字列）を与えることで、この文字列に対する圧縮符号を得ることができるようになっている。この場合、格納対象データは圧縮符号であり、そのキーは圧縮文字列である。なお、辞書式データ圧縮システムについては、例えば、特開平９−２１８８７７号公報、特開２０１１−２２１８４５号公報などに記載されたものがある。
【０１２６】
この辞書式データ圧縮システムは、図２７に示すようなデータセットの格納依頼を受けると、このデータセットを、以下の手順で、メインメモリ１０１上に作成されるハッシュテーブル２２に格納する。
まず、辞書式データ圧縮システムに備えられる上述のデータ検索装置１のデータ格納処理部２は、図２７に示すような格納対象のデータセットを受けとったら、データ分割部７によって、図２９に示すように、格納対象のデータセットを複数のデータセットに分割する。
【０１２７】
ここでは、データ格納処理部２は、データ分割部７によって、図２８に示すように、格納対象のデータセットを構成する複数のデータのそれぞれのキーのＣＲＣ３２値を計算し、算出された各ＣＲＣ３２値を小規模データセットの数（ここでは４）で割った余りの値（ＣＲＣ値）を算出する。そして、算出されたＣＲＣ値が同じデータが同じ小規模データセットに含まれるように、図２９に示すように、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。つまり、算出されたＣＲＣ値を、複数の小規模データセットの識別番号（データセット番号）として用い、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。例えば、ＳＳＥ４．２拡張命令セットをサポートするＣＰＵを用いる場合、ハードウェア的に組み込まれたＣＲＣ３２ｃ演算命令（組み込み関数名：ｃｒｃ３２）を用いて高速に複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割することができる。
【０１２８】
次に、データ格納処理部２は、ハッシュ関数決定部８によって、図３０に示すように、複数の小規模データセットのそれぞれに対する複数のハッシュ関数を決定する。
次に、データ格納処理部２は、ハッシュ係数値表作成部９（ハッシュ関数実体管理表作成部）によって、図３１に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表（ハッシュ関数実体管理表）を作成する。
【０１２９】
次に、データ格納処理部２は、対応表作成部１０（ハッシュ関数インデックス表作成部）によって、図３２に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表（ハッシュ関数インデックス表）を作成する。
次に、データ格納処理部２は、ハッシュテーブル作成部１１によって、複数のデータセットのそれぞれに対する複数のハッシュテーブル２２を作成する。
【０１３０】
ここでは、データ格納処理部２は、ハッシュテーブル作成部１１によって、まず、各小規模データセットに対応するハッシュテーブル２２のサイズを決定する。例えば、各小規模データセットに含まれるデータの数ｎ′が「３」の場合、各小規模データセットに対するハッシュテーブル２２のサイズをＲＯＵＮＤ（ｎ′÷０．８）で「４」に決定すれば良い。また、例えば、各小規模データセットに含まれるデータの数ｎ′が「４」の場合、各小規模データセットに対するハッシュテーブルのサイズをＲＯＵＮＤ（ｎ′÷０．８）で「５」に決定すれば良い。これにより、各小規模データセットのサイズに基づいてハッシュテーブル２２のサイズを決定することで、各小規模データセットに対するハッシュテーブル２２のデータ格納率を約８０％にすることができる。
【０１３１】
次に、データ格納処理部２は、ハッシュテーブル作成部１１によって、各小規模データセットに対するハッシュテーブル２２を作成し、メインメモリ１０１に格納する。
ここでは、小規模データセットの識別番号であるＣＲＣ値を用いて対応表から取得したインデックス番号を用いて、小規模データセットに割り当てられたハッシュ関数を特定するハッシュ係数の値を取得し、これを用いて小規模データセットに割り当てられたハッシュ関数によって小規模データセットに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値を小規模データセットに対するハッシュテーブル２２のサイズで割った余りの値を算出し、この余りの値が小さい順に、メインメモリ１０１上の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、各小規模データセットに対するハッシュテーブル２２を作成する。
【０１３２】
具体的には、識別番号（データセット番号）が「０」、即ち、ＣＲＣ値が「０」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「０」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは４）で割った余りの値を算出すると、図３３に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「０」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「０」の小規模データセットに対するハッシュテーブル２２を作成すると、図３４に示すようになる。
【０１３３】
同様に、識別番号（データセット番号）が「１」、即ち、ＣＲＣ値が「１」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「１」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは５）で割った余りの値を算出すると、図３５に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「１」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「１」の小規模データセットに対するハッシュテーブル２２を作成すると、図３６に示すようになる。
【０１３４】
また、同様に、識別番号（データセット番号）が「２」、即ち、ＣＲＣ値が「２」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「２」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは４）で割った余りの値を算出すると、図３７に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「２」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「２」の小規模データセットに対するハッシュテーブル２２を作成すると、図３８に示すようになる。
【０１３５】
また、同様に、識別番号（データセット番号）が「３」、即ち、ＣＲＣ値が「３」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「３」の小規模データセットに対するハッシュテーブル２２のサイズ（ここでは５）で割った余りの値を算出すると、図３９に示すようになる。そして、この余りの値が小さい順に、メインメモリ１０１上のデータセット番号「３」の小規模データセットに対するハッシュテーブル２２のハッシュ値に基づいて特定される番地（第１格納位置）又は次の番地（第２格納位置）に格納して、データセット番号「３」の小規模データセットに対するハッシュテーブル２２を作成すると、図４０に示すようになる。
【０１３６】
ところで、この辞書式データ圧縮システムは、データの検索依頼、即ち、データ圧縮のための文字列検索依頼を受けると、以下の手順で、メインメモリ１０１上の複数のハッシュテーブル２２に対してデータ検索（文字列検索）を行なう。
ここでは、検索対象データ（圧縮符号）のキーとして圧縮文字列「ａａ」を受け取った場合を例に挙げて説明する。
【０１３７】
まず、図４１に示すように、辞書式データ圧縮システムに備えられるデータ検索装置１のデータ検索処理部３は、ハッシュテーブル特定部１２によって、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル２２の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル２２を特定する。
【０１３８】
ここでは、データ検索処理部３は、検索対象データのキーとして圧縮文字列「ａａ」を受けとったら（ステップＧ１０）、ハッシュテーブル特定部１２によって、検索対象データのキーとしての圧縮文字列「ａａ」のＣＲＣ３２値を計算し（ステップＧ２０）、算出されたＣＲＣ３２値（ここでは「０ｘ１４４２９ｆ０４」）を小規模データセットの数（ここでは「５」）で割った余りの値（ＣＲＣ値；ここでは「３」）を算出する（ステップＧ３０）。
【０１３９】
次に、データ検索処理部３は、ハッシュ係数値取得部１３によって、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表（図３２参照）及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表（図３１参照）を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する（ステップＧ４０、Ｇ５０）。
【０１４０】
ここでは、データ検索処理部３は、ハッシュ係数値取得部１３によって、上述のようにして検索対象データのキーに基づいて算出したＣＲＣ値（ここでは「３」）を使って、ＣＰＵキャッシュメモリ１１１上の対応表（図３２参照）を用いて、インデックス番号（ここでは「２」）を取得し（ステップＧ４０）、このインデックス番号（ここでは「２」）を用いて、ＣＰＵキャッシュメモリ１１１上のハッシュ係数値表（図３１参照）から、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）を取得する（ステップＧ５０）。
【０１４１】
次に、データ検索処理部３は、ハッシュ値計算部１４によって、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する（ステップＧ６０）。
ここでは、データ検索処理部３は、ハッシュ値計算部１４によって、検索対象データのキー（ここでは圧縮文字列「ａａ」）、及び、上述のようにして取得した、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値（ここではＲ１〜Ｒ８の各値）を用いて、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれる１つのハッシュ関数によってハッシュ値を計算する（ステップＧ６０）。そして、算出したハッシュ値を、検索対象データを含むデータセットに対するハッシュテーブル２２のサイズ（ここでは「５」）で割った余りの値を算出し、この余りの値として「１」を得る（ステップＧ６０）。
【０１４２】
次に、データ検索処理部３は、読出部１５によって、一のハッシュテーブル２２から、ハッシュ値に基づいて特定される第１格納位置及び第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出す（ステップＧ７０）。
ここでは、データ検索処理部３は、読出部１５によって、上述のようにして検索対象データのキーに基づいて算出したＣＲＣ値（ここでは「３」）によって特定されたハッシュテーブル（３番目のハッシュテーブル）２２から、上述のようにして算出したハッシュ値をハッシュテーブル２２のサイズで割った余りの値（ここでは「１」）によって特定される番地（第１格納位置；ここでは「１」）及び次の番地（第２格納位置；ここでは「２」）に格納されているデータ及びキーをメインメモリ１０１から読み出す。
【０１４３】
次に、データ検索処理部３は、出力部１６によって、第１格納位置又は第２格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する（ステップＧ８０〜Ｇ１００）。
ここでは、データ検索処理部３は、出力部１６によって、まず、ハッシュ値に基づいて特定される番地（ここでは「１」）から読み出したキー（ここでは「ａａｂ」）が、検索対象データのキー（ここでは「ａａ」）と一致するかを判定し（ステップＧ８０）、次に、ハッシュ値に基づいて特定される番地の次の番地（ここでは「２」）から読み出したキー（ここでは「ａａ」）が、検索対象データのキー（ここでは「ａａ」）と一致するかを判定する（ステップＧ９０）。これらの判定の結果、ハッシュ値に基づいて特定される番地の次の番地（ここでは「２」）から読み出したキーが、検索対象データのキーと一致すると判定し、ハッシュ値に基づいて特定される番地の次の番地（ここでは「２」）から読み出したキー（ここでは「ａａ」）に対応づけられているデータ（ここでは「Ｃ」）を得て（ステップＧ９０）、検索対象データである圧縮符号として出力する（ステップＧ１００）。
【０１４４】
ところで、上述のデータ検索装置（データ格納方法及びデータ検索方法）をデータ圧縮のための辞書として用いる辞書式データ圧縮システムでは、検索処理時間が検索対象文字列の長さに依存しない性質を利用して、以下のようにして、与えられた文字列の先頭からの最長一致文字列を二分探索手法によって発見する手順と、この手順の逐次的な適用によって、与えられた文字列を圧縮して圧縮符号列を得ることができる。これに対し、Ｐｒｅｆｉｘ木を用いたものでは、検索処理時間が検索対象文字列の長さに比例するため、先頭からの最長一致文字列が長いケースにおいて、最長一致文字列の発見に要する時間が長くなり、データ圧縮処理時間が長くなってしまう。
【０１４５】
ここでは、辞書式データ圧縮システムにおいて、文字列「ａａｂｂａｂｂ」を圧縮して圧縮符合列を得る場合を例に挙げて説明する。
まず、辞書式データ圧縮システムは、文字列「ａａｂｂａｂｂ」の圧縮依頼を受け取ると（ステップＨ１０）、まず、文字列「ａａｂｂ」を、上述のデータ検索装置１に入力する（ステップＨ２０）。そして、上述のデータ検索装置１は、検索対象データ（圧縮符号）のキーとして圧縮文字列「ａａｂｂ」を受け取ると、上述と同様の処理を行なって、エラーメッセージを出力する。このため、辞書式データ圧縮システムは、文字列「ａａｂｂ」に対してエラーメッセージを得る（ステップＨ２０）。
【０１４６】
次に、辞書式データ圧縮システムは、文字列「ａａ」を、上述のデータ検索装置１に入力する（ステップＨ３０）。そして、上述のデータ検索装置１は、検索対象データ（圧縮符号）のキーとして圧縮文字列「ａａ」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「Ｃ」を出力する。このため、辞書式データ圧縮システムは、文字列「ａａ」に対して圧縮符号として「Ｃ」を得る（ステップＨ３０）。
【０１４７】
次に、辞書式データ圧縮システムは、文字列「ａａｂ」を、上述のデータ検索装置１に入力する（ステップＨ４０）。そして、上述のデータ検索装置１は、検索対象データ（圧縮符号）のキーとして圧縮文字列「ａａｂ」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「Ｈ」を出力する。このため、辞書式データ圧縮システムは、文字列「ａａｂ」に対して圧縮符号として「Ｈ」を得る（ステップＨ４０）。
【０１４８】
このようにして、圧縮文字列「ａａｂｂ」に対してエラーメッセージを得て、圧縮文字列「ａａ」に対して圧縮符号「Ｃ」を得て、圧縮文字列「ａａｂ」に対して圧縮符号「Ｈ」を得た場合、辞書式データ圧縮システムは、辞書中で文字列「ａａｂｂａｂｂ」の先頭からの最長一致文字列は「ａａｂ」であると判定する（ステップＨ５０）。
次に、辞書式データ圧縮システムは、文字列「ｂａｂ」を、上述のデータ検索装置１に入力する（ステップＨ６０）。そして、上述のデータ検索装置１は、検索対象データ（圧縮符号）のキーとして圧縮文字列「ｂａｂ」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「Ｌ」を出力する。このため、辞書式データ圧縮システムは、文字列「ｂａｂ」に対して圧縮符号として「Ｌ」を得る（ステップＨ６０）。
【０１４９】
次に、辞書式データ圧縮システムは、文字列「ｂａｂｂ」を、上述のデータ検索装置１に入力する（ステップＨ７０）。そして、上述のデータ検索装置１は、検索対象データ（圧縮符号）のキーとして圧縮文字列「ｂａｂｂ」を受け取ると、上述と同様の処理を行なって、エラーメッセージを出力する。このため、辞書式データ圧縮システムは、文字列「ｂａｂｂ」に対してエラーメッセージを得る（ステップＨ７０）。
【０１５０】
このようにして、圧縮文字列「ｂａｂ」に対して圧縮符号「Ｌ」を得て、圧縮文字列「ｂａｂｂ」に対してエラーメッセージを得た場合、辞書式データ圧縮システムは、辞書中で文字列「ｂａｂｂ」の先頭からの最長一致文字列は「ｂａｂ」であると判定する（ステップＨ８０）。
次に、辞書式データ圧縮システムは、文字列「ｂ」を、上述のデータ検索装置１に入力する（ステップＨ９０）。そして、上述のデータ検索装置１は、検索対象データ（圧縮符号）のキーとして圧縮文字列「ｂ」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「Ｂ」を出力する。このため、辞書式データ圧縮システムは、文字列「ｂ」に対して圧縮符号として「Ｂ」を得る（ステップＨ９０）。
【０１５１】
そして、辞書式データ圧縮システムは、上述のようにして得られた圧縮文字列「ａａｂ」に対する圧縮符号「Ｈ」、圧縮文字列「ｂａｂ」に対する圧縮符号「Ｌ」、圧縮文字列「ｂ」に対する圧縮符号「Ｂ」に基づいて、文字列「ａａｂｂａｂｂ」を圧縮した圧縮符合列として「ＨＬＢ」を得て、これを出力する（ステップＨ１００）。
したがって、このような辞書式データ圧縮システムにおいて、上述のデータ検索装置１をデータ圧縮のための辞書として用いることで、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。例えば、辞書式データ圧縮機能を有するデータベースシステムにおいて、辞書を構成するハッシュテーブル２２にアクセスするためのハッシュ値の計算に用いる対応表及びハッシュ係数値表をＣＰＵキャッシュメモリ１１１上に格納することで、データ圧縮処理を高速化し、ユーザからのデータ更新要求やデータ挿入要求に対する応答性を向上させることができる。
【０１５２】
なお、本発明は、上述した実施形態に記載した構成に限定されるものではなく、本発明の趣旨を逸脱しない範囲で種々変形することが可能である。
例えば、上述の実施形態では、データ検索装置を、コンピュータにデータ格納プログラムやデータ検索プログラムをインストールしたものとして構成しているが、上述の実施形態における処理をコンピュータに実行させるデータ格納プログラムやデータ検索プログラム（上述のような機能をコンピュータに実現させるためのデータ格納プログラムやデータ検索プログラム）は、コンピュータ読取可能な記録媒体に格納した状態で提供される場合もある。
【０１５３】
ここで、記録媒体には、例えば半導体メモリなどのメモリ，磁気ディスク，光ディスク［例えばＣＤ（Compact Disc）−ＲＯＭ，ＤＶＤ（Digital Versatile Disk），ブルーレイディスク等］，光磁気ディスク（ＭＯ：Magneto optical Disc）等のプログラムを記録することができるものが含まれる。なお、磁気ディスク，光ディスク，光磁気ディスク等を可搬型記録媒体ともいう。
【０１５４】
この場合、ドライブ装置を介して、可搬型記録媒体からデータ格納プログラムやデータ検索プログラムを読み出し、読み出されたデータ格納プログラムやデータ検索プログラムを記憶装置にインストールすることになる。これにより、上述の実施形態で説明したデータ検索装置、データ格納方法及びデータ検索方法が実現され、上述の実施形態の場合と同様に、記憶装置にインストールされたデータ格納プログラムやデータ検索プログラムを、ＣＰＵがメインメモリ上に読み出して実行することで、上述の実施形態の各処理が行なわれることになる。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。
【０１５５】
また、上述の実施形態における処理をコンピュータに実行させるデータ格納プログラムやデータ検索プログラムは、例えば伝送媒体としてのネットワーク（例えばインターネット，公衆回線や専用回線等の通信回線等）を介して提供される場合もある。
例えば、プログラム提供者が例えばサーバなどの他のコンピュータ上で提供しているデータ格納プログラムやデータ検索プログラムを、例えばインターネットやＬＡＮ等のネットワーク及び通信インタフェースを介して、記憶装置にインストールしても良い。これにより、上述の実施形態で説明したデータ検索装置、データ格納方法及びデータ検索方法が実現され、上述の実施形態の場合と同様に、記憶装置にインストールされたデータ格納プログラムやデータ検索プログラムを、ＣＰＵがメインメモリ上に読み出して実行することで、上述の実施形態の各処理が行なわれることになる。なお、コンピュータは、例えばサーバなどの他のコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０１５６】
以下、上述の実施形態及び変形例に関し、更に、付記を開示する。
（付記１）
コンピュータに、
データセットを複数のデータセットに分割し、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行させ、
前記複数のハッシュ関数を決定する処理において、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第１格納位置又は前記第１格納位置に連続する第２格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータに実行させ、
前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第１格納位置又は前記第２格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータに実行させることを特徴とするデータ格納プログラム。
【０１５７】
（付記２）
前記対応情報を作成する処理において、キャッシュメモリ上に保持しうる情報量の対応情報を作成する処理を前記コンピュータに実行させ、
前記ハッシュ係数値情報を作成する処理において、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成する処理を前記コンピュータに実行させることを特徴とする、付記１に記載のデータ格納プログラム。
【０１５８】
（付記３）
前記複数のハッシュ関数を決定する処理において、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、付記１又は２に記載のデータ格納プログラム。
【０１５９】
（付記４）
前記複数のハッシュ関数を決定する処理において、前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが２つ以上ある場合に、前記候補ハッシュ関数を前記２つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定する処理を含む処理を前記コンピュータに実行させ、
前記対応情報を作成する処理において、一つのハッシュ関数を特定するハッシュ係数の値と前記２つ以上のデータセットとを対応づけている対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、付記１〜３のいずれか１項に記載のデータ格納プログラム。
【０１６０】
（付記５）
前記複数のハッシュ関数を決定する処理において、前記複数のデータセットのそれぞれに対する複数のハッシュ関数として１６個又は３２個のハッシュ関数を決定する処理を前記コンピュータに実行させ、
前記対応情報を作成する処理において、前記複数のハッシュ関数のそれぞれを特定する前記複数のハッシュ係数の値と前記複数のデータセットとを対応づけ、かつ、４ビット又は５ビットで構成されている複数のインデックスを含む対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、付記１〜４のいずれか１項に記載のデータ格納プログラム。
【０１６１】
（付記６）
コンピュータに、
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第１格納位置及び前記第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出し、
前記第１格納位置又は前記第２格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
処理を実行させることを特徴とするデータ検索プログラム。
【０１６２】
（付記７）
前記対応情報及び前記ハッシュ係数値情報は、キャッシュメモリ上に保持しうる情報量になっていることを特徴とする、付記６に記載のデータ検索プログラム。
（付記８）
前記複数のハッシュ関数は、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれることを特徴とする、付記６又は７に記載のデータ検索プログラム。
【０１６３】
（付記９）
前記対応情報は、一つのハッシュ関数を特定するハッシュ係数の値と２つ以上のデータセットとを対応づけていることを特徴とする、付記６〜８のいずれか１項に記載のデータ検索プログラム。
（付記１０）
前記複数のハッシュ関数は、１６個又は３２個のハッシュ関数であり、
前記対応情報は、前記複数のデータセットと前記複数のハッシュ関数のそれぞれを特定する前記ハッシュ係数の値とを対応づける複数のインデックスを含み、前記複数のインデックスは、それぞれ、４ビット又は５ビットで構成されていることを特徴とする、付記６〜９のいずれか１項に記載のデータ検索プログラム。
【０１６４】
（付記１１）
データセットを複数のデータセットに分割するデータ分割部と、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定するハッシュ関数決定部と、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成するハッシュ係数値情報作成部と、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成する対応情報作成部と、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成するハッシュ情報作成部とを備え、
前記ハッシュ関数決定部は、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第１格納位置又は前記第１格納位置に連続する第２格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定し、
前記ハッシュ情報作成部は、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第１格納位置又は前記第２格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成することを特徴とするデータ検索装置。
【０１６５】
（付記１２）
前記対応情報作成部は、キャッシュメモリ上に保持しうる情報量の対応情報を作成し、
前記ハッシュ係数値情報作成部は、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成することを特徴とする、付記１１に記載のデータ検索装置。
（付記１３）
前記ハッシュ関数決定部は、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、付記１１又は１２に記載のデータ検索装置。
【０１６６】
（付記１４）
前記ハッシュ関数決定部は、前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが２つ以上ある場合に、前記候補ハッシュ関数を前記２つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定し、
前記対応情報作成部は、一つのハッシュ関数を特定するハッシュ係数の値と前記２つ以上のデータセットとを対応づけている対応情報を作成することを特徴とする、付記１１〜１３のいずれか１項に記載のデータ検索装置。
【０１６７】
（付記１５）
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定するハッシュ情報特定部と、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得するハッシュ係数値取得部と、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算するハッシュ値計算部と、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第１格納位置及び前記第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出す読出部と、
前記第１格納位置又は前記第２格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する出力部とを備えることを特徴とするデータ検索装置。
【０１６８】
（付記１６）
コンピュータが、
データセットを複数のデータセットに分割し、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行し、
前記複数のハッシュ関数を決定する処理において、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第１格納位置又は前記第１格納位置に連続する第２格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータが実行し、
前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第１格納位置又は前記第２格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータが実行することを特徴とするデータ格納方法。
【０１６９】
（付記１７）
前記対応情報を作成する処理において、キャッシュメモリ上に保持しうる情報量の対応情報を作成する処理を前記コンピュータが実行し、
前記ハッシュ係数値情報を作成する処理において、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成する処理を前記コンピュータが実行することを特徴とする、付記１６に記載のデータ格納方法。
【０１７０】
（付記１８）
前記複数のハッシュ関数を決定する処理において、データのキー列｛ｘ１，ｘ２，ｘ３，．．．，ｘｎ｝をｘＫ（１≦Ｋ≦ｎ）として、ハッシュ係数Ｒ（１≦Ｒ≦２５６）の値によって特定され、ｆＲ（ｘＫ）＝ｆＲ（ｘＫ−１）×Ｒ＋ｘＫ［但し、ｆＲ（ｘ０）＝Ｒ０（Ｒ０は初期値）］で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、付記１６又は１７に記載のデータ格納方法。
【０１７１】
（付記１９）
前記複数のハッシュ関数を決定する処理において、前記第１格納位置又は前記第２格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが２つ以上ある場合に、前記候補ハッシュ関数を前記２つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定する処理を含む処理を前記コンピュータが実行し、
前記対応情報を作成する処理において、一つのハッシュ関数を特定するハッシュ係数の値と前記２つ以上のデータセットとを対応づけている対応情報を作成する処理を前記コンピュータが実行することを特徴とする、付記１６〜１８のいずれか１項に記載のデータ格納方法。
【０１７２】
（付記２０）
コンピュータが、
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第１格納位置及び前記第１格納位置に連続する第２格納位置に格納されているデータ及びキーを読み出し、
前記第１格納位置又は前記第２格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
処理を実行することを特徴とするデータ検索方法。
【符号の説明】
【０１７３】
１  データ検索装置
２  データ格納処理部
３  データ検索処理部
４  ハッシュ係数値表記憶部（ハッシュ関数実体管理表記憶部）
５  対応表記憶部（ハッシュ関数インデックス表記憶部）
６  ハッシュテーブル記憶部
７  データ分割部
８  ハッシュ関数決定部
９  ハッシュ係数値作成部
１０  対応表作成部
１１  ハッシュテーブル作成部
１２  ハッシュテーブル特定部
１３  ハッシュ係数値取得部
１４  ハッシュ値計算部
１５  読出部
１６  出力部
２０  ハッシュ係数値表（ハッシュ関数実体管理表）
２１  対応表（ハッシュ関数インデックス表）
２２  ハッシュテーブル
１０１  メインメモリ
１０２  ＣＰＵ
１０３  表示制御部
１０４  表示装置
１０５  記憶装置
１０６  入力装置
１０７  ドライブ装置
１０８  可搬型記録媒体
１０９  通信制御部
１１０  バス
１１１  キャッシュメモリ（ＣＰＵキャッシュメモリ）
【図１】
2014130489.tif 000004
【図２】
2014130489.tif 000005
【図３】
2014130489.tif 000006
【図４】
2014130489.tif 000007
【図５】
2014130489.tif 000008
【図６】
2014130489.tif 000009
【図７】
2014130489.tif 000010
【図８】
2014130489.tif 000011
【図９】
2014130489.tif 000012
【図１０】
2014130489.tif 000013
【図１１】
2014130489.tif 000014
【図１２】
2014130489.tif 000015
【図１３】
2014130489.tif 000016
【図１４】
2014130489.tif 000017
【図１５】
2014130489.tif 000018
【図１６】
2014130489.tif 000019
【図１７】
2014130489.tif 000020
【図１８】
2014130489.tif 000021
【図１９】
2014130489.tif 000022
【図２０】
2014130489.tif 000023
【図２１】
2014130489.tif 000024
【図２２】
2014130489.tif 000025
【図２３】
2014130489.tif 000026
【図２４】
2014130489.tif 000027
【図２５】
2014130489.tif 000028
【図２６】
2014130489.tif 000029
【図２７】
2014130489.tif 000030
【図２８】
2014130489.tif 000031
【図２９】
2014130489.tif 000032
【図３０】
2014130489.tif 000033
【図３１】
2014130489.tif 000034
【図３２】
2014130489.tif 000035
【図３３】
2014130489.tif 000036
【図３４】
2014130489.tif 000037
【図３５】
2014130489.tif 000038
【図３６】
2014130489.tif 000039
【図３７】
2014130489.tif 000040
【図３８】
2014130489.tif 000041
【図３９】
2014130489.tif 000042
【図４０】
2014130489.tif 000043
【図４１】
2014130489.tif 000044
【図４２】
2014130489.tif 000045