(57)【要約】【課題】ハッシュテーブルに登録されているすべてのデータを取り出すとき、ハッシュテーブルのサイズやハッシュテーブルに格納されているデータの数に影響なく、データが登録されているバケットを高速に探索することができるデータ管理装置を提供する。【解決手段】ハッシュテーブルと、登録するデータハッシュ値により求められたハッシュテーブル上のバケットから開始されるデータ情報を保持する要素のチェインリストと、ハッシュテーブル上の登録済バケットの関連付けを保持するリンク情報とからなるハッシュテーブル記憶手段１４を設ける。チェインリストにデータ情報を登録するときに、ハッシュテーブル上の新たなバケットに登録した場合、この新たなバケットを登録済のバケットの次に辿るべきバケットとしてリンク情報を変更するようにした。【選択図】　　　　図２
2004145729.tif 000002
【特許請求の範囲】
【請求項１】
ハッシュ関数を用いて登録するデータの格納場所を決定するデータ管理装置において、ハッシュテーブルと、登録するデータにハッシュ関数を適用して求められた前記ハッシュテーブル上のバケットから開始されるデータに関する情報を保持する要素をチェインによってリンクしたチェインリストと、前記ハッシュテーブル上の登録済バケットの関連付けを保持するリンク情報とからなるハッシュテーブル記憶手段と、登録するデータにハッシュ関数を適用して求められたバケットから示すチェインリストに該データに関する情報を登録して前記ハッシュテーブル記憶手段へ格納するデータ登録手段とを備え、前記ハッシュテーブル上の新たなバケットに登録した場合、この新たなバケットをデータが登録済のバケットの次に辿るべきバケットとして前記リンク情報を変更するようにしたことを特徴とするデータ管理装置。
【請求項２】
請求項１に記載のデータ管理装置において、前記リンク情報が、データが登録済であるバケットの前に辿るべきバケットの位置を表す情報と、データが登録済であるバケットの後ろに辿るべきバケットの位置を表す情報とからなることを特徴とするデータ管理装置。
【請求項３】
請求項１または２に記載のデータ管理装置において、前記リンク情報がバケットを示すインデックスであることを特徴とするデータ管理装置。
【請求項４】
請求項１、２または３に記載のデータ管理装置において、登録したデータの検索を行うデータ検索手段を備え、前記データ検索手段は、全データを取り出すときには、前記リンク情報から前記ハッシュテーブルにデータを登録しているバケットを取り出して、そのバケットからリンクされているチェインリストから登録されているデータを取り出すようにしたことを特徴とするデータ管理装置。
【請求項５】
請求項１、２、３または４に記載のデータ管理装置において、登録したデータの削除を行うデータ削除手段を備え、前記データ削除手段は、指定された削除データを前記チェインリストから削除し、このチェインリストに登録されたデータがなくなった場合、この削除データを示すバケットを前記リンク情報から削除するようにしたことを特徴とするデータ管理装置。
【請求項６】
コンピュータに、請求項１乃至５のいずれかに記載のデータ管理装置の機能を実行させるためのプログラム。
【請求項７】
請求項６に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、データを登録し検索可能にするデータ管理装置並びにプログラムおよび記録媒体に関し、特に、ハッシュ関数を用いてデータの格納場所を求めるデータ管理装置に関する。
【０００２】
【従来の技術】
コンピュータにおけるデータの登録、検索などのデータ管理を行う手法の一つにハッシュ法がある（非特許文献１および特許文献１を参照）。
ハッシュ法は、データをある一定の長さのハッシュ値に圧縮するため、ハッシュ値に衝突が起こる場合がある。
例えば、図１３に示したように、ハッシュテーブルの大きさをｎとしたとき、ハッシュテーブルはｎ個のバケットに分割され、それぞれのバケットは１からｎまでのインデックスによって指し示される。
この図１３の場合、インデックスｎにおいてハッシュ値が衝突しており、チェイン法を用いて解決している。
【０００３】
このハッシュ法を使って、あるデータを登録するときは、以下の手順で処理する。
（１）登録するデータに対してハッシュ関数を適用し、ハッシュ値を求める。
（２）求めたハッシュ値をインデックスとするバケットを求める。
（３）求めたバケットに登録されているものがあるか調べる。
（４）図１３に示したインデックス２のバケットのように、空ポインタのゼロが記憶されており、何も登録されていないバケットへは、登録するデータ（またはそのデータへのポインタ）を格納した要素を生成し、その要素へのポインタをバケットに登録する（インデックス１または３を参照）。
（５）または、図１３に示したインデックス１やインデックス３のバケットのように、すでにチェインの先頭要素へのポインタが記憶されているバケットへは、登録するデータ（またはそのデータへのポインタ）を格納した要素を生成し、その要素へのポインタをバケットに登録する。また、生成した要素には、元の先頭要素へのポインタを記憶する（インデックスｎを参照）。その結果、新たに生成した要素がチェインの先頭となり、元の先頭要素はチェインの先頭から２番目の要素となる。
【０００４】
以上のようにハッシュテーブルを使ってデータ値を登録すると、同じハッシュ値が得られるデータは、そのハッシュ値をインデックスとするバケットに格納されたチェインリストに登録されることになる。
【０００５】
以上のようにして登録されたデータを取り出すには、以下の手順で処理する。
（１）現在処理中のバケットのインデックスを１に初期化する。
（２）現在処理中のバケットのインデックスがｎより大きければ、すべてのバケットを処理しているので、データの取り出し処理を終了する。
（３）現在処理中のバケットに格納されているチェインリストの先頭要素へのポインタを取り出して、現在処理中の要素へのポインタとする。
（Ａ）現在処理中の要素へのポインタが空ポインタのゼロであれば、現在処理中の要素をすべて処理したので、（４）へ進む。
（Ｂ）さもなければ、そのポインタが指す要素に格納されているデータを取り出す。
（Ｃ）ポインタが指す要素に格納されている、次の要素へのポインタを取り出し、現在処理中の要素へのポインタとし、（Ａ）へ戻る。
（４）現在処理中のバケットのインデックスに１を加え、（２）へ戻る。
【０００６】
特許文献２の「テーブル管理方式」では、ハッシュテーブルに登録されるすべての要素をその登録順に依存しない独立した順序で辿ることを可能にするために、それぞれの要素に次の要素を得るための情報（例えば、ポインタ）を格納するようにしている。この情報を使うことにより、ハッシュテーブルにデータがどのような順序に登録されているかとは無関係に、すべての要素を任意の順序、例えば、それらが保持するデータの昇順に並ぶような順序に並べることができる。
【０００７】
【非特許文献１】
萩原宏、西原清一著「現代データ構造とプログラム技法」、
オーム社、１９８７年１０月
【特許文献１】
特許第３０５６７０４号公報（従来技術）
【特許文献２】
特開平０５−０８１１０２号公報
【０００８】
【発明が解決しようとする課題】
上述したように、ハッシュテーブルに登録されているすべてのデータを取り出すとき、あるバケットにチェインの先頭要素へのポインタが格納されていない場合、そのバケットの（インデックス＋１）のバケット以降にチェインの先頭要素へのポインタが登録されているかを、１つずつ調べていく必要がある。
【０００９】
この調査は、ハッシュテーブルのサイズが大きくなるにつれ、また、ハッシュテーブルに格納されているデータの数が少なくなるにつれ、バケットにチェインの先頭要素へのポインタが登録されていない場合が多くなり、次のデータを得るために必要なバケットの探索に必要な時間が長くなっていく。
【００１０】
特許文献２の技術は、この問題を解決するためのものであり、一般的なチェイン法を用いるハッシュテーブルと比較して、要素を次へ次へと辿るだけなので、登録されているすべてのデータを高速に取り出すことができる。
しかし、次の要素を得るための情報を要素ごとに格納するため、その情報のための領域が登録される要素の数に比例して必要となってくる。
【００１１】
本発明は、上述の実情を考慮してなされたものであって、ハッシュテーブルに登録されているすべてのデータを取り出すとき、ハッシュテーブルのサイズやハッシュテーブルに格納されているデータの数に影響なく、データが登録されているバケットを高速に探索することができるデータ管理装置並びにプログラムおよび記録媒体を提供することを目的とする。
【００１２】
【課題を解決するための手段】
上記の課題を解決するために、本発明の請求項１のデータ管理装置は、ハッシュ関数を用いて登録するデータの格納場所を決定するデータ管理装置において、ハッシュテーブルと、登録するデータにハッシュ関数を適用して求められた前記ハッシュテーブル上のバケットから開始されるデータに関する情報を保持する要素をチェインによってリンクしたチェインリストと、前記ハッシュテーブル上の登録済バケットの関連付けを保持するリンク情報とからなるハッシュテーブル記憶手段と、登録するデータにハッシュ関数を適用して求められたバケットから示すチェインリストに該データに関する情報を登録して前記ハッシュテーブル記憶手段へ格納するデータ登録手段とを備え、前記ハッシュテーブル上の新たなバケットに登録した場合、この新たなバケットをデータが登録済のバケットの次に辿るべきバケットとして前記リンク情報を変更するようにしたことを特徴とする。
【００１３】
また、本発明の請求項２は、請求項１に記載のデータ管理装置において、前記リンク情報が、データが登録済であるバケットの前に辿るべきバケットの位置を表す情報と、データが登録済であるバケットの後ろに辿るべきバケットの位置を表す情報とからなることを特徴とする。
また、本発明の請求項３は、請求項１または２に記載のデータ管理装置において、前記リンク情報がバケットを示すインデックスであることを特徴とする。
【００１４】
また、本発明の請求項４は、請求項１、２または３に記載のデータ管理装置において、登録したデータの検索を行うデータ検索手段を備え、前記データ検索手段は、全データを取り出すときには、前記リンク情報から前記ハッシュテーブルにデータを登録しているバケットを取り出して、そのバケットからリンクされているチェインリストから登録されているデータを取り出すようにしたことを特徴とする。
【００１５】
また、本発明の請求項５は、請求項１、２、３または４に記載のデータ管理装置において、登録したデータの削除を行うデータ削除手段を備え、前記データ削除手段は、指定された削除データを前記チェインリストから削除し、このチェインリストに登録されたデータがなくなった場合、この削除データを示すバケットを前記リンク情報から削除するようにしたことを特徴とする。
【００１６】
また、本発明の請求項６のプログラムは、コンピュータに、請求項１乃至５のいずれかに記載のデータ管理装置の機能を実行させるためのプログラムである。また、本発明の請求項７の記録媒体は、請求項６に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体である。
【００１７】
したがって、ハッシュテーブルに登録されているすべてのデータを取り出すとき、ハッシュテーブルのサイズやハッシュテーブルに格納されているデータの数に影響なく、データが登録されているバケットを高速に探索することができる。
【００１８】
さらに、データの取り出し順が正順でも逆順でも同様に、ハッシュテーブルのサイズやハッシュテーブルに格納されているデータの数に影響なく、バケットを高速に探索することができる。
【００１９】
【発明の実施の形態】
以下、図面を参照して本発明に係るデータ管理装置の一実施形態を説明する。図１は、本発明に係るデータ管理装置の実施形態を構成するコンピュータシステムのブロック図である。
図１において、本実施形態は、サーバ１０および端末２０とから構成される。
【００２０】
端末２０は、システムの利用者がサーバ１０で実行されているデータ管理装置に対して登録・検索・削除するデータそのものやデータが記録されているデータファイルなどを指定したり、得られた操作の結果を出力するために利用するコンピュータである。
一般に、端末２０には、問合せ要求を入力するためのキーボードおよびマウス等のポインティングデバイスや、問合せ結果を表示するためのディスプレイが装備されている。
また、端末２０は、ＣＰＵ、メモリ、ハードディスクを備え、プログラムが実行可能である。
【００２１】
サーバ１０は、端末２０と通信網３０で接続され、端末２０からの操作要求に応じた処理を行い、その結果を端末２０に返すためのコンピュータである。
また、サーバ１０は、ＣＰＵ、メモリ、ハードディスクを備え、データ管理のためのプログラムが実行可能である。
サーバ１０によって管理されるデータは、ハードディスクなどの記録媒体に記録される。
【００２２】
ここで、通信網３０は、サーバ１０および端末２０間を結合するための伝送路であって、一般には、ケーブルで実現され、通信プロトコルにはＴＣＰ／ＩＰが使われる。但し、伝送路としてはケーブルだけではなく、それらの間の通信プロトコルが一致するものであれば有線または無線のいずれでもよく、例えば、公衆回線や専用回線等によるＬＡＮ（Ｌｏｃａｌ　Ａｒｅａ　Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ　Ａｒｅａ　Ｎｅｔｗｏｒｋ）、インターネットなどを用いることができる。
【００２３】
また、本発明のデータ管理装置の各機能が端末２０ですべて実行されるときには、上述したサーバ１０および通信網３０は必要としない。
【００２４】
図２は、本発明に係るデータ管理装置の機能構成を示すブロック図であり、同図において、データ管理装置は、データ入出力手段２１、データ登録手段１１、ハッシュテーブル記憶手段１４、データ検索手段１２、データ削除手段１３とを少なくとも含んでいる。
【００２５】
データ入出力手段２１は、端末２０において動作し、利用者が端末２０を介して入力する、データの登録、検索、削除要求を受け付け、この要求をそれぞれ処理し、その結果を出力する。
【００２６】
データ登録手段１１、データ検索手段１２、データ削除手段１３およびハッシュテーブル記憶手段１４は、サーバ１０で動作し、データ管理装置の機能の一部を構成する。
【００２７】
まず、データ登録手段１１、データ検索手段１２およびデータ削除手段１３で使うハッシュテーブル、チェインリストおよびリンク情報を記憶するハッシュテーブル記憶手段１４のデータ構造について説明する。このハッシュテーブル記憶手段１４は、サーバ１０のメモリまたはハードディスク上に記憶される。
【００２８】
図３は、本実施形態で使用するハッシュテーブル記憶手段１４のデータ構造の一例であり、ハッシュテーブルＨおよびチェインリストＣのデータ構造は、従来の技術で説明したものと同じである。
【００２９】
すなわち、ハッシュテーブルＨの大きさをｎとしたとき、ハッシュテーブルＨはｎ個のバケットに分割され、それぞれのバケットは１からｎまでのインデックスによって指し示される。
データが登録されていない各バケットはゼロが設定される。
データを登録するときは、データにハッシュ関数を適用し、ハッシュ値を求めてハッシュ値をインデックスとするバケットを求める。
（１）この求めたバケットに登録されているものがない（バケットに格納されている値がゼロ）場合には、要素Ｅを生成し、その要素Ｅへのポインタをバケットに登録する。
この要素Ｅは、登録するデータ（またはそのデータへのポインタ）Ｅｖと同じハッシュ値をもつデータの他の要素ＥへのポインタＥｐとから構成される。
要素ＥのポインタＥｐがゼロに設定されていれば、次にチェインされる要素がないことを示している。
【００３０】
（２）または、この求めたバケットに登録されているものがある場合には、登録するデータ（またはそのデータへのポインタ）を格納した要素Ｅを生成し、生成した要素ＥのチェインポインタＥｐには、バケットに登録されているチェインリストの先頭要素へのポインタを格納し、バケットには生成した要素Ｅへのポインタを登録する。
【００３１】
以下、本実施形態では、リンク情報の表現形式として、バケットを示すインデックスを使用するものとして説明する。
図３において、リンク情報は、後リンク開始インデックスＢと後リンク情報Ｎ、および前リンク開始インデックスＡと前リンク情報Ｐからなっている。
【００３２】
後リンク開始インデックスＢと後リンク情報Ｎは、それぞれインデックス０の要素、その後にインデックス１からｎの各バケットに対応した要素をならべて１つの配列として構成する。
後リンク開始インデックスＢは、ハッシュテーブルＨに登録されているすべてのデータを取得するときに、最初に探索すべきバケットのインデックスが記憶される。後リンク情報Ｎは、バケットからチェインされている要素を探索後、次に探索を開始するバケットのインデックスを格納している。後リンク情報Ｎの値がゼロのときは、次に探索するバケットがないことを示す。
【００３３】
例えば、図４において、後リンク開始インデックスＢ（インデックス０）の格納値は３であるから最初に探索されるのは、インデックス３のバケットから行われる。
インデックス３のバケットの後リンク情報Ｎにはｎが格納されているので、このバケットの次に探索されるバケットはインデックスｎのバケットである。
また、インデックス１の後リンク情報Ｎにはゼロが格納されているので、このバケットの次に探索するバケットが存在しない。
【００３４】
同様に、前リンク開始インデックスＡと前リンク情報Ｐは、それぞれインデックス０の要素、その後にインデックス１からｎの各バケットに対応した要素をならべて１つの配列として構成する。
前リンク開始インデックスＡは、ハッシュテーブルＨに登録されているすべてのデータを取得するときに、後リンク情報で辿る順序の逆順にバケットを並べたときの最初に探索すべきバケットのインデックスが記憶される。前リンク情報Ｐは、バケットからチェインされている要素を探索後、次に探索を開始するバケットのインデックスを格納している。前リンク情報Ｐの値がゼロのときは、次に探索するバケットがないことを示す。
【００３５】
例えば、図４において、前リンク開始インデックスＡ（インデックス０）の格納値は１であるから最初に探索されるのは、インデックス１のバケットから行われる。
インデックス１のバケットの前リンク情報Ｐにはｎが格納されているので、このバケットの次に探索されるバケットはインデックスｎのバケットである。
また、インデックス２の前リンク情報Ｐにはゼロが格納されているので、このバケットの次に探索するバケットが存在しない。
【００３６】
データ登録手段１１は、データ入出力手段２１からのデータ登録要求に応じ、与えられたデータが登録されるべきチェインを求め、そのチェインの先頭要素としてデータを登録する。
データ登録手段１１の処理手順を図５に示すフローチャートによって説明する。
ここで、データを登録するに先立ち、前リンク開始インデックスＡ、後リンク開始インデックスＢおよびハッシュテーブルＨの各バケットの値をゼロに初期化しておく。
【００３７】
データ入出力手段２１から渡された登録データに対してハッシュ関数を適用して、ハッシュ値を求める（ステップＳ１，Ｓ２）。
求めたハッシュ値をインデックスとするバケットを求める（ステップＳ３）。以下、求めたバケットのインデックスをｉとする。
登録するデータ（またはそのデータへのポインタ）を格納する要素を生成する（ステップＳ３）。
この要素は、チェインリストＣにおけるもので、図３における要素Ｅに対応するもので、登録するデータ（またはそのデータへのポインタ）をＥｖへ格納し、ゼロをＥｐへ格納している。
【００３８】
インデックスｉのバケットの内容がゼロであるかを調べる（ステップＳ５）。
インデックスｉのバケットの内容がゼロでなければ（ステップＳ５のＹＥＳ）、すでにチェインの先頭要素へのポインタが登録されているので、生成したチェインリストＣの要素のＥｐ領域にインデックスｉのバケットの内容を格納し（ステップＳ６）、ステップＳ１１へ進む。その結果、今生成した要素がチェインリストの先頭となる。
【００３９】
一方、インデックスｉのバケットの内容がゼロであれば（ステップＳ５のＮＯ）、インデックスｉの前リンク情報をゼロとして格納する（ステップＳ７）。
後リンク開始インデックスの内容をインデックスとする前リンク情報にｉを格納する（ステップＳ８）。
インデックスｉの後リンク情報として、後リンク開始インデックスの内容を格納する（ステップＳ９）。
後リンク開始インデックスにｉを格納する（ステップＳ１０）。
最後に、チェインリストに生成した要素へのポインタをインデックスｉのバケットに登録し（ステップＳ１１）、データの登録を終了する。
【００４０】
例えば、図４の状態のハッシュテーブル記憶手段１４に対して、ハッシュ値が２のデータを登録すると、図６のように登録される。
【００４１】
データ検索手段１２は、データ入出力手段２１からのデータ検索要求が１つのデータを検索するものであれば、ハッシュテーブルから与えられたデータが登録されているチェインリスト中の要素を求め、その要素が検索対象となるデータを保持しているか否かによって、その結果をデータ入出力手段２１に返す。
また、データ入出力手段２１からの全データ取得要求があれば、リンク情報を参照しながらすべてのチェインの全要素を取り出し、その結果をデータ入出力手段２１に返す。
【００４２】
まず、１つのデータを検索する要求を受けたときのデータ検索手段１２の処理手順を図７に示すフローチャートによって説明する。
検索対象となるデータに対してハッシュ関数を適用し、ハッシュ値を求める（ステップＳ２１，Ｓ２２）。
求めたハッシュ値をインデックスとするバケットを求める（ステップＳ２３）。
現在処理中の要素へのポインタをバケットに格納されているチェインの先頭要素へのポインタとする（ステップＳ２４）。
【００４３】
現在処理中の要素へのポインタがゼロであるかを調べる（ステップＳ２５）。
現在処理中の要素へのポインタがゼロであれば（ステップＳ２５のＮＯ）、検索しているデータは登録されていないとして処理を終了する（ステップＳ２６）。
一方、現在処理中の要素へのポインタがゼロでなければ（ステップＳ２５のＹＥＳ）、そのポインタが示す要素に格納されているデータを取り出し、検索対象であるデータと等しければ（ステップＳ２７のＹＥＳ）、このデータが検索しているデータであるとして処理を終了する（ステップＳ２８）。
ポインタで示された要素のデータが検索対象のデータでなければ、その要素に格納されている次の要素へのポインタを現在処理中の要素へのポインタとして置き換え（ステップＳ２９）、ステップＳ２５へ戻る。
【００４４】
次に、すべてのデータを取り出す要求を受けたときのデータ検索手段１２の処理手順を図８に示すフローチャートによって説明する。
以下、後リンク情報を使った全データの取得を説明するが、前リンク情報を使った全データの取得も同様にできる。すなわち、後リンク情報を使ったときの手順において、後リンク情報の代わりに前リンク情報を使えばよい。
【００４５】
現在処理中のバケットのインデックスを後リンク開始インデックスの内容で初期化する（ステップＳ３１）。
現在処理中のバケットのインデックスがゼロであれば（ステップＳ３２のＹＥＳ）、すべてのバケットを処理したとして処理を終了する。
これまでに取り出されたデータは、全データの取り出し要求したデータ入出力手段２１へ戻される。
【００４６】
現在処理中の要素へのポインタをバケットに格納されているチェインリストの先頭要素へのポインタで初期化する（ステップＳ３３）。
現在処理中の要素へのポインタがゼロであるか調べ、空ポインタであるゼロであれば（ステップＳ３４のＮＯ）、現在処理中の要素へのポインタがなくなったので現在処理中のバケットのインデックスを現在処理中のバケットの後リンク情報に置き換えて（ステップＳ３５）、ステップＳ３２へ戻る。
この処理で、同じハッシュ値（インデックス）を持つデータを示すチェインリストに関するデータの取り出しを終了し、次のハッシュ値を持つデータの処理へ移る。
【００４７】
一方、現在処理中の要素へのポインタがゼロでない場合（ステップＳ３４のＹＥＳ）、そのポインタで示される要素に格納されているデータを取り出す（ステップＳ３６）。
要素に格納されている次の要素へのポインタを得て、現在処理中の要素へのポインタとし（ステップＳ３７）、ステップＳ３４へ戻る。
【００４８】
データ削除手段１３は、データ入出力手段２１からのデータ削除要求に応じ、与えられたデータが登録されているチェインリストを求め、そのチェインリスト中に与えられた削除要求されたデータが登録されていれば、削除し、その結果をデータ入出力手段２１に返す。
データ削除手段１３の処理手順を図９および図１０に示すフローチャートによって説明する。
【００４９】
データ入出力手段２１から渡された削除対象となるデータに対してハッシュ関数を適用し、ハッシュ値を求める（ステップＳ４１，Ｓ４２）。
求めたハッシュ値をインデックスとするバケットを求める（ステップＳ４３）。以下、ここで求めたインデックスをｉとする。
現在処理中の要素へのポインタをバケットに格納されているチェインの先頭要素へのポインタとする（ステップＳ４４）。
【００５０】
現在処理中の要素へのポインタがゼロであるかを調べる（ステップＳ４５）。
現在処理中の要素へのポインタがゼロであれば（ステップＳ４５のＮＯ）、削除指定されたデータは登録されていないとして処理を終了する（ステップＳ４６）。
一方、現在処理中の要素へのポインタがゼロでない場合（ステップＳ４５のＹＥＳ）、そのポインタで示される要素に格納されているデータが削除対象であるデータと一致しなければ（ステップＳ４７のＮＯ）、その要素に格納されている次の要素へのポインタを現在処理中の要素へのポインタとして置き換え（ステップＳ４８）、ステップＳ４５へ戻る。
一方、そのポインタで示される要素に格納されているデータが削除対象であるデータと一致していれば（ステップＳ４７のＹＥＳ）、このデータが削除しているデータであるので、以下の処理を行う。
【００５１】
削除するデータを格納する要素がチェインリストの先頭であるか調べ、チェインの先頭であれば（ステップＳ４９のＹＥＳ）、削除する要素が示す次の要素のポインタをバケットへ格納し、この削除対象の要素を削除する（ステップＳ５０）。
例えば、図１１（Ａ）に示すように、チェインリスト中の先頭の要素（値１を格納する要素）を削除する場合、この値１を格納する要素の次の要素（値２を格納する要素）へのポインタをバケットに格納する。
【００５２】
また、削除する要素がチェインリストの先頭でなければ、（ステップＳ４９のＮＯ）削除するデータを格納する要素の直前の要素が指すポインタを、削除するデータを格納する要素の次の要素へのポインタとし、この削除対象の要素を削除する（ステップＳ５１）。
例えば、図１１（Ｂ）に示すように、チェインリスト中の２番目の要素（値２を格納する要素）を削除する場合、この値２を格納する要素の次の要素（値３を格納する要素）へのポインタを、１番目の要素（値１を格納する要素）の次の要素を指すポインタとする。
【００５３】
次に、削除対象の要素を削除した後、まだチェインリスト中に要素があれば（ステップＳ５２のＮＯ）、削除処理を終了する。
一方、削除対象の要素を削除した結果、チェインリストにひとつも要素がなくなれば（ステップＳ５２のＹＥＳ）、図１０のフローチャートで示す以下の処理を行う。
【００５４】
インデックスｉの後リンク情報をｊとしたとき、インデックスｊの前リンク情報をインデックスｉの前リンク情報と置き換える（ステップＳ５３）。
インデックスｉの前リンク情報をｋとしたとき、インデックスｋの後リンク情報をインデックスｉの後リンク情報と置き換える（ステップＳ５４）。
【００５５】
後リンク開始インデックスの内容がインデックスｉであれば（ステップＳ５５のＹＥＳ）、後リンク開始インデックスをインデックスｉの後リンク情報に置き換える（ステップＳ５６）。
前リンク開始インデックスの内容がインデックスｉであれば（ステップＳ５７のＹＥＳ）、前リンク開始インデックスをインデックスｉの前リンク情報と置き換える（ステップＳ５８）。
最後に、インデックスｉの後リンク情報および前リンク情報にゼロを格納し（ステップＳ５９，Ｓ６０）、削除処理を終了する。
【００５６】
例えば、図４に示した状態のハッシュテーブル記憶手段１４の内容から、ハッシュ値が３のバケットの先頭に格納されているデータを削除すると、図１２に示すようになる。
【００５７】
本発明は、上述した実施形態のみに限定されたものではない。上述した実施形態のデータ管理装置を構成する各機能をそれぞれプログラム化し、あらかじめＣＤ−ＲＯＭ等の記録媒体に書き込んでおき、コンピュータに搭載したＣＤ−ＲＯＭドライブのような媒体駆動装置にこのＣＤ−ＲＯＭ等を装着して、これらのプログラムをコンピュータのメモリあるいは記憶装置に格納し、それを実行することによって、本発明の目的が達成されることは言うまでもない。
この場合、記録媒体から読み出されたプログラム自体が上述した実施形態の機能を実現することになり、そのプログラムおよびそのプログラムを記録した記録媒体も本発明を構成することになる。
【００５８】
なお、プログラムを格納する記録媒体としては半導体媒体（例えば、ＲＯＭ、不揮発性メモリカード等）、光媒体（例えば、ＤＶＤ、ＭＯ、ＭＤ、ＣＤ等）、磁気媒体（例えば、磁気テープ、フレキシブルディスク等）等のいずれであってもよい。
【００５９】
また、ロードしたプログラムを実行することにより上述した実施形態の機能が実現されるだけでなく、そのプログラムの指示に基づき、オペレーティングシステムあるいは他のアプリケーションプログラム等と共同して処理することによって上述した実施形態の機能が実現される場合も含まれる。
【００６０】
市場に流通させる場合には、可搬型の記録媒体にプログラムを格納して流通させたり、インターネット等の通信網を介して接続されたサーバコンピュータの記憶装置に格納しておき、通信網を通じて他のコンピュータに転送することもできる。この場合、このサーバコンピュータの記憶装置も本発明の記録媒体に含まれる。なお、可搬型の記録媒体上のプログラム、または転送されてくるプログラムを、コンピュータに内蔵する記録媒体へインストールし、そのインストールされたプログラムを実行することによって上述した実施形態の機能が実現される。
【００６１】
【発明の効果】
以上説明したように本発明によれば、ハッシュテーブルに登録されているすべてのデータを取り出すとき、ハッシュテーブルのサイズやハッシュテーブルに格納されているデータの数に影響なく、データが登録されているバケットを高速に探索することができる。
【００６２】
さらに、データの取り出し順が正順でも逆順でも同様に、ハッシュテーブルのサイズやハッシュテーブルに格納されているデータの数に影響なく、バケットを高速に探索することができる。
【図面の簡単な説明】
【図１】本発明に係るデータ管理装置の実施形態を構成するコンピュータシステムのブロック図である。
【図２】本発明に係るデータ管理装置の機能構成を示すブロック図である。
【図３】ハッシュデータ記憶手段のデータ構造の一例である。
【図４】ハッシュデータ記憶手段のデータ設定を説明するための図である。
【図５】データ登録手段の処理手順を示すフローチャートである。
【図６】図４のハッシュデータ記憶手段に新たなデータを登録した一例である。
【図７】指定されたデータの検索要求を受けた場合のデータ検索手段の処理手順を示すフローチャートである。
【図８】全データの取り出し要求を受けた場合のデータ検索手段の処理手順を示すフローチャートである。
【図９】データ削除手段の処理手順を示すフローチャートである。
【図１０】データ削除手段の処理手順を示すフローチャートである（図９の続き）。
【図１１】チェインリストから要素を削除するときの説明図である。
【図１２】図４に示した状態のハッシュテーブル記憶手段からデータを削除したときの一例である。
【図１３】従来のハッシュテーブルの構成を説明するための図である。
【符号の説明】
Ａ…前リンク開始インデックス、Ｐ…前リンク情報、Ｂ…後リンク開始インデックス、Ｎ…後リンク情報、Ｈ…ハッシュテーブル、Ｅ…チェインリストの要素、Ｅｖ…要素Ｅのデータ値またはデータへのポインタ、Ｅｐ…要素Ｅのチェインリスト中の次の要素へのポインタ、１０…サーバ、１１…データ登録手段、１２…データ検索手段、１３…データ削除手段、１４…ハッシュテーブル記憶手段、２０…端末、２１…データ入出力手段、３０…通信網。
【図１】
2004145729.tif 000003
【図２】
2004145729.tif 000004
【図３】
2004145729.tif 000005
【図４】
2004145729.tif 000006
【図５】
2004145729.tif 000007
【図６】
2004145729.tif 000008
【図７】
2004145729.tif 000009
【図８】
2004145729.tif 000010
【図９】
2004145729.tif 000011
【図１０】
2004145729.tif 000012
【図１１】
2004145729.tif 000013
【図１２】
2004145729.tif 000014
【図１３】
2004145729.tif 000015