(57)【特許請求の範囲】
【請求項１】
キー値データベースのハッシュ・テーブルのバースティングを行う、コンピュータによって実現される方法であって、
キー、及び前記キーに関連付けられた値を受け取る工程と、
プレフィックス及びサフィックスに前記キーを再帰的に分けることにより、前記キー値データベースのトライ・ノードをルート・ノードからリーフ・ノードまで辿る工程であって、全ての反復により、前記サフィックスに関連付けられた値が前記キーの属性であり、前記キーが前記キー値データベースの現在のノードの値と比較される工程と、
前記キー値データベースの前記リーフ・ノードに達する工程であって、前記リーフ・ノードが前記ハッシュ・テーブルであり、該ハッシュ・テーブルは、単一のプレフィックスによって決定される単一のパスによってのみ到達可能である純粋なハッシュ・テーブルであり、該純粋なハッシュ・テーブルには、前記キー、及び該キーに関連付けられた値が記憶されており、前記純粋なハッシュ・テーブルに記憶されたキー値対全てのキーはこの同じプレフィックスで始まる工程と、
前記キーが前記ハッシュ・テーブルに記憶されていないことを判定する工程と、
前記ハッシュ・テーブルが、前記キー及び前記値を記憶することができないことを判定する工程と、
前記ハッシュ・テーブルを除去する工程と、
新たなトライ・ノードを親トライ・ノードと関連付ける工程と、
２つ以上の新たなハッシュ・テーブルを前記新たなトライ・ノードと関連付ける工程であって、前記２つ以上の新たなハッシュ・テーブルの１つが前記キー及び前記値を記憶することができる工程と、
前記ハッシュ・テーブルからのキー及び関連付けられた値全てを前記２つ以上の新たなハッシュ・テーブルの１つに移動させる工程と、
前記キー及び前記関連付けられた値を前記２つ以上の新たなハッシュ・テーブルの１つに挿入する工程と
を含む、コンピュータによって実現される方法。
【請求項２】
キー値データベースのハッシュ・テーブルのバースティングを行う、コンピュータによって実現される方法であって、
キー、及び前記キーに関連付けられた値を受け取る工程と、
プレフィックス及びサフィックスに前記キーを再帰的に分けることにより、前記キー値データベースのトライ・ノードをルート・ノードからリーフ・ノードまで辿る工程であって、全ての反復により、前記サフィックスに関連付けられた値が前記キーの属性であり、前記キーが前記キー値データベースの現在のノードの値と比較される工程と、
前記キー値データベースの前記リーフ・ノードに達する工程であって、前記リーフ・ノードが前記ハッシュ・テーブルであり、該ハッシュ・テーブルは、複数のプレフィックスによって決定される複数のパスによって到達可能であるハイブリッド・ハッシュ・テーブルであり、該ハイブリッド・ハッシュ・テーブルには、前記キー、及び該キーに関連付けられた値が記憶されており、前記ハイブリッド・ハッシュ・テーブルに記憶されたキー値対全てのキーはこの同じ複数のプレフィックスで始まる工程と、
前記キーが前記ハッシュ・テーブルに記憶されていないことを判定する工程と、
前記ハッシュ・テーブルが、前記キー及び前記値を記憶することができないことを判定する工程と、
前記ハッシュ・テーブルを除去する工程と、
新たなトライ・ノードを親トライ・ノードと関連付ける工程と、
２つ以上の新たなハッシュ・テーブルを前記新たなトライ・ノードと関連付ける工程であって、前記２つ以上の新たなハッシュ・テーブルの１つが前記キー及び前記値を記憶することができる工程と、
前記ハッシュ・テーブルからのキー及び関連付けられた値全てを前記２つ以上の新たなハッシュ・テーブルの１つに移動させる工程と、
前記キー及び前記関連付けられた値を前記２つ以上の新たなハッシュ・テーブルの１つに挿入する工程と
を含む、コンピュータによって実現される方法。
【請求項３】
キー値データベースのハッシュ・テーブルのバースティングを行う、コンピュータによって実現される方法であって、
キー、及び前記キーに関連付けられた値を受け取る工程と、
プレフィックス及びサフィックスに前記キーを再帰的に分けることにより、前記キー値データベースのトライ・ノードをルート・ノードからリーフ・ノードまで辿る工程であって、全ての反復により、前記サフィックスに関連付けられた値が前記キーの属性であり、前記キーが前記キー値データベースの現在のノードの値と比較される工程と、
前記キー値データベースの前記リーフ・ノードに達する工程であって、前記リーフ・ノードが前記ハッシュ・テーブルであり、該ハッシュ・テーブルは、複数のプレフィックスによって決定される複数のパスによって到達可能である半純粋なハッシュ・テーブルであり、該半純粋なハッシュ・テーブルには、前記キー、及び該キーに関連付けられた値が記憶されており、前記半純粋なハッシュ・テーブルに記憶されたキー値対全てのキーは同じプレフィックスで始まる工程と、
前記キーが前記ハッシュ・テーブルに記憶されていないことを判定する工程と、
前記ハッシュ・テーブルが、前記キー及び前記値を記憶することができないことを判定する工程と、
前記ハッシュ・テーブルを除去する工程と、
新たなトライ・ノードを親トライ・ノードと関連付ける工程と、
２つ以上の新たなハッシュ・テーブルを前記新たなトライ・ノードと関連付ける工程であって、前記２つ以上の新たなハッシュ・テーブルの１つが前記キー及び前記値を記憶することができる工程と、
前記ハッシュ・テーブルからのキー及び関連付けられた値全てを前記２つ以上の新たなハッシュ・テーブルの１つに移動させる工程と、
前記キー及び前記関連付けられた値を前記２つ以上の新たなハッシュ・テーブルの１つに挿入する工程と
を含む、コンピュータによって実現される方法。
【請求項４】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、更に、前記除去されたハッシュ・テーブルを前記新たなトライ・ノードと関連付けし直し、別のハッシュ・テーブル・ノードに属するキー値対を前記新たなトライ・ノードから切り離す工程を更に含む、コンピュータによって実現される方法。
【請求項５】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、各キーが固定長暗号ハッシュである、コンピュータによって実現される方法。
【請求項６】
請求項５記載のコンピュータによって実現される方法であって、各固定長暗号ハッシュ値が一意の値を有している可能性を最大にする暗号ハッシュ関数を使用して、前記固定長暗号ハッシュが導き出される、コンピュータによって実現される方法。
【請求項７】
請求項５記載のコンピュータによって実現される方法であって、ハッシュ値の明白なグルーピングが存在しないような、ハッシュのランダム分布をもたらす暗号ハッシュ関数を使用して前記固定長暗号ハッシュが導き出される、コンピュータによって実現される方法。
【請求項８】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、前記キー値データベースは、ハッシュ・テーブル及びトライ・ノードの１つ又は複数を含む、コンピュータによって実現される方法。
【請求項９】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、各トライ・ノードは、更なるトライ・ノードへの、又はハッシュ・テーブルへの１つ又は複数のポインタを含む、コンピュータによって実現される方法。
【請求項１０】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、前記ハッシュ・テーブルは、共通のプレフィックスを備えた１つ又は複数のキー値対を含む、コンピュータによって実現される方法。
【請求項１１】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、複数のキー値データベースは、複数のルート・ノードを追跡することにより、同じ永続性記憶装置を共有する、コンピュータによって実現される方法。
【請求項１２】
請求項１１記載のコンピュータによって実現される方法であって、前記複数のルート・ノードのいくつかが初期化の時点で構成される、コンピュータによって実現される方法。
【請求項１３】
請求項１１記載のコンピュータによって実現される方法であって、複数のルート・ノードの１つ又は複数は実行時に追加することが可能である、コンピュータによって実現される方法。
【請求項１４】
請求項１１記載のコンピュータによって実現される方法であって、複数のルート・ノードの１つ又は複数は実行時に削除することが可能である、コンピュータによって実現される方法。
【請求項１５】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、単一のキーは複数の値を有し得、前記単一のキーに関連付けられた各値は２つ以上の別々のキー値データベースに記憶される、コンピュータによって実現される方法。
【請求項１６】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、前記キー値データベースが１つ又は複数の不揮発性記憶装置内に作成され、それにより、利用可能なランダム・アクセス・メモリ（ＲＡＭ）の容量をいくつかのキーが超える場合に効率的な実行を可能にする、コンピュータによって実現される方法。
【請求項１７】
請求項１６記載のコンピュータによって実現される方法であって、前記１つ又は複数の不揮発性記憶装置は電源なしで、記憶された情報を維持するコンピュータ・メモリを含む、コンピュータによって実現される方法。
【請求項１８】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、前記キー値データベースのオブジェクトに関連付けられたメモリ位置を追跡するための効率的なキャッシング手法を利用する工程を更に含む、コンピュータによって実現される方法。
【請求項１９】
請求項１８記載のコンピュータによって実現される方法であって、前記効率的なキャッシング手法は、最近最も使用されていない(Least Recently Used; LRU)アルゴリズムである、コンピュータによって実現される方法。
【請求項２０】
請求項１８記載のコンピュータによって実現される方法であって、前記効率的なキャッシング手法は、階層ＬＲＵキャッシング・アルゴリズムである、コンピュータによって実現される方法。
【請求項２１】
請求項２０記載のコンピュータによって実現される方法であって、前記階層ＬＲＵキャッシング・アルゴリズムに関連付けられた階層は、一次的に子ノードの数から導き出され、二次的に前記階層ＬＲＵキャッシング・アルゴリズムにより、各レベル内で導き出される、コンピュータによって実現される方法。
【請求項２２】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、ハッシュ・テーブルには、より多くのハッシュ・テーブルを削除する前に、１つ又は複数の子ノードを有するトライ・ノードが削除されるような特定の最小量のキャッシュ空間が保証される、コンピュータによって実現される方法。
【請求項２３】
請求項２２記載のコンピュータによって実現される方法であって、トライ・ノードの前記削除により、対応する関連付けられた子ノード全ても削除される、コンピュータによって実現される方法。
【請求項２４】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、前記ハッシュ・テーブル内のレコードのサイズはキャッシュ・ライン・サイズの整数の倍数である、コンピュータによって実現される方法。
【請求項２５】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、前記キー値データベースのハッシュ・テーブルはオープン・アドレス法モデルを使用してサーチされる、コンピュータによって実現される方法。
【請求項２６】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、線形探索アルゴリズム、二次探索アルゴリズム、ダブル・ハッシング・アルゴリズム、及び複数ハッシング・アルゴリズムの１つ又は複数による、ハッシュ・バケット衝突の解決を更に含む、コンピュータによって実現される方法。
【請求項２７】
請求項２６記載のコンピュータによって実現される方法であって、前記ダブル・ハッシング・アルゴリズム又は前記複数ハッシング・アルゴリズムは、暗号ハッシュをセグメント化することによって使用され、各セグメント・インデックスをハッシュ値として使用する、コンピュータによって実現される方法。
【請求項２８】
請求項１乃至３のいずれか一項に記載のコンピュータによって実現される方法であって、キーを表す暗号ハッシュのプレフィックスをとり、整数の数として前記プレフィックスを扱い、使用する際にバケットの数で前記値を除算した場合の剰余をとることにより、バケットを選ぶことにより、一次ハッシュ・バケットを選ぶ工程を更に含む、コンピュータによって実現される方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は一般にデータ処理に関し、特に、暗号ハッシュ・データベースを生成し、管理する方法及びシステムに関する。
【背景技術】
【０００２】
本セクションにおいて説明する手法は、追求し得るが、必ずしも、先行して考え出されたか、又は追求された訳でない手法である。したがって、別途明記しない限り、本セクションにおいて説明する手法の何れも、単に本セクションに含められていることにより、従来技術としてみなされると解釈すべきでない。
【０００３】
トライ（ｔｒｉｅ）すなわちプレフィックス・ツリー（ｐｒｅｆｉｘ  ｔｒｅｅ）は、キーが通常、ストリングである連想配列(アレイ)を記憶するために使用される順序付き木データ構造である。バイナリ・サーチ・ツリーと違って、ツリー内のノードは、そのノードに関連付けられたキーを記憶しない。その代わりに、ツリー内のその位置は、それが関連付けられたキーを規定する。ノードの子孫は全て、そのノードに関連付けられたストリングの共通のプレフィックスを有し、ルートは空ストリングに関連付けられる。値は、通常、全てのノードと関連付けられる訳でなく、関心のキーに対応する一部の内部ノード及びリーフのみと関連付けられる。トライは、メモリ内のストリングを管理するための非常に高速のツリーベースのデータ構造である一方、空間集約的である。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
バースティングされたトライは、トライのブランチを作成する前にキー値対を記憶するためにバケットを使用するトライである。バケットが満杯の場合、バケットには「バースティング」が行われ、バケットはブランチになる。バースティングされたトライは、標準トライとほぼ同速度を有するが、トライチェインをバケットに収納することにより、空間を削減する。別の利点は、小さいキー値対の組に対して、より効率的なデータ構造をバケット内で使用し、通常のトライよりも高速にすることが可能であることである。バースティングされたトライのサーチには、クエリ・ストリングのプレフィックスを使用して、次いでバケット内のレコードを見つけるためにクエリ・ストリングの残りを使用して特定のバケットを識別することが関係する。当初、バースティングされたツリーは単一のバケットを含む。コンテナが非効率的であると認められる場合、コンテナにはバースティングが行われ、次いで、コンテナは、元のコンテナのストリングを区分する子ビンの組及びトライ・ノードによって置き換えられる。高速であるが、バースティングされたトライはキャッシュを意識していない。多くのメモリ内データ構造と同様に、メモリ・アクセスが全て、等コストである状況において効率的である。しかし、実際には、メモリへの単一のランダム・アクセスには通常、何百ものクロック・サイクルが発生する。
【０００５】
空間集約的であるが、トライはキャッシュを意識し得る。トライ・ノードはサイズが小さく、それにより、頻繁にアクセスされるトライパスがキャッシュ内に存在している確率が増加する。しかし、バースティングされたトライは、そのキャッシュ非効率性について知られている連結リストとしてバケットを表す。連結リストを辿る場合、子のアドレスは、親が処理されるまで知ることが可能でない。このことは、ポインタ追跡問題として知られており、実行しているプログラムに先行してデータを予想し、キャッシュにロードすることにより、キャッシュミスの削減を試行するハードウェア・プリフェッチャの有効性を妨げる。
【０００６】
「ＨＡＴ−ｔｒｉｅ：Ａ  Ｃａｃｈｅ−ｃｏｎｓｃｉｏｕｓ  Ｔｒｉｅ−ｂａｓｅｄ  Ｄａｔａ  Ｓｔｒｕｃｔｕｒｅ  ｆｏｒ  Ｓｔｒｉｎｇｓ」は、その全部を参照により、本明細書及び特許請求の範囲において援用するＮｉｋｏｌａｓ  Ａｓｋｉｔｉｓ及びＲａｎｊａｎ  Ｓｉｎｈａによる刊行物である。これには、可変長ストリングのバースティングされたトライのアルゴリズムが開示されているが、前述の可変長ストリングの処理は開示していない。更に、上記刊行物には、キャッシュを意識する一方、バースティングされたトライのアルゴリズムの効率を向上させることができないデータ構造及びアルゴリズムが開示されている。
【０００７】
更に、既存のデータ構造は何れも、利用可能なＲＡＭの容量を超えるデータセットを処理することを可能にするものでない。
【課題を解決するための手段】
【０００８】
本概要は、詳細な説明において以下に更に説明された、単純化された形式での概念の選択肢を紹介するために提供する。本概要は、特許請求の範囲に記載の主題の主要な構成又は必須の構成を識別することを意図するものでなく、特許請求の範囲に記載の主題の範囲の規定を助けるものとして使用されることを意図するものでもない。
【０００９】
キー値データベースのハッシュ・テーブルのバースティングを行う方法及びシステムを提供する。例示的な一実施形態では、キー値データベースのハッシュ・テーブルのバースティングを行う方法は、キー、及びキーに関連付けられた値を受け取る工程と、キーをプレフィックス及びサフィックスに再帰的に分けることにより、キー値データベースのトライ・ノードをル―ト・ノードからリーフ・ノードまで辿る工程とを含み得る。全ての反復により、キーには、サフィックスに関連付けられた値が帰され、キー値データベースの現在のノードの値と比較され得る。キー値データベースの（ハッシュ・テーブルでもある）リーフ・ノードに達し、キーがハッシュ・テーブルに記憶されていないと判定されると、ハッシュ・テーブルがキー及び値を記憶することができるか否かが更に判定され得る。ハッシュ・テーブルに既に記憶されているデータの量が、キー及び関連付けられた値の記憶を可能にしないと判定された場合、ハッシュ・テーブルが除去され、新たなトライ・ノードがハッシュ・テーブルの親トライ・ノードと関連付けられ、２つ以上の新たなハッシュ・テーブルが、新たなトライ・ノードと関連付けられ得る。その後、取り外されたハッシュ・テーブルからのキー及び関連付けられた値は全て、新たなハッシュ・テーブルに移動させ得、新たなキー、及び関連付けられた値は、２つ以上の新たなハッシュ・テーブルのうちの１つに挿入し得る。
【００１０】
上記及び関連する目的の実現のために、１つ又は複数の局面は、以下に詳細に説明し、特許請求の範囲に特記する構成を含む。以下の説明及び図面は、１つ又は複数の局面の特定の例証的な構成を詳細に表している。しかし、前述の構成は、種々の局面の原理を使用し得る種々のやり方のうちのいくつかのやり方を示しているに過ぎず、前述の説明は、前述の局面及びその均等物全てを含むことを意図しているものでない。
【００１１】
本発明の実施形態は、添付図面の図における限定の目的でなく、例示の目的で例証し、同様な参照符号は同様な構成要素を示す。
【図面の簡単な説明】
【００１２】
【図１】ハッシュ・データベース（ＨＤＢ）を管理する方法の実現に適したコンピューティング環境を示す図である。
【図２】キー値データベースのハッシュ・テーブルのバースティングを行う、コンピュータによって実現される方法を示す例示的なプロセス・フローチャートである。
【図３】例示的な暗号キー値データベースを示すブロック図である。
【図４】例示的なノード・ヘッダを示すブロック図である。
【図５】例示的なトライ・ノードを示すブロック図である。
【図６】例示的なハッシュ・テーブル・ノードを示すブロック図である。
【図７】純粋なハッシュ・テーブルを例示するブロック図である。
【図８】ハイブリッド・ハッシュ・テーブルを例示するブロック図である。
【図９】半純粋なハッシュ・テーブルを例示するブロック図である。
【図１０】新たな暗号キー値データベースの作成を示すフローチャートである。
【図１１】新たなキー値対のＨＤＢへの挿入を示すフロー図である。
【図１２】高レベル・バースティング・アルゴリズムを示すフローチャートである。
【図１３】純粋なハッシュ・テーブルのバースティングを示すフローチャートである。
【図１４】半純粋なハッシュ・テーブルのバースティングを示すフローチャートである。
【図１５】ハイブリッド・ハッシュ・テーブルのバースティングを示すフローチャートである。
【図１６】新たなトライ・ノードの作成を示すフローチャートである。
【図１７】新たなハッシュ・ノードの作成を示すフローチャートである。
【図１８】キーがデータベース内に存在しているか否かを判定し、キーがデータベース内に存在している場合、キーに関連付けられた値を判定する方法を示すフローチャートである。
【図１９】キー及びその関連付けられた値をハッシュ・テーブルから削除する方法を示すフローチャートである。
【図２０】ハッシュ・テーブル内の特定のキーの新たな値の挿入を示すフローチャートである。
【図２１】キー及び対応する値をハッシュ・テーブルから削除する方法を示すフローチャートである。
【図２２】ハッシュ・テーブル内の新たな値で、旧い値を置き換える方法を示すフローチャートである。
【図２３】キャッシュ・キューの判定を示すフローチャートである。
【図２４】ノードのキャッシュへの挿入を示すフローチャートである。
【図２５】キャッシュからのノードの削除を示すフローチャートである。
【図２６】ディスクからのノードのロード、及びそのキャッシュへの追加を示すフローチャートである。
【図２７】修正されたノードにマーキングし、クリーンなキャッシュからダーティーなキャッシュにノードを移動させる方法を示すフローチャートである。
【図２８】ロックされたキャッシュにノードを移動させることにより、削除することができないとしてノードにマーキングすることを示すフローチャートである。
【図２９】ロックされたキャッシュを退出させ、そのキャッシュにもう一度、移動させることによる、ノードのアンロックを示すフローチャートである。
【図３０】ロックされたキャッシュのノード全てをもう一度、それらそれぞれのキャッシュに移動させることを示すフローチャートである。
【図３１】キャッシュから１つ又は複数の、クリーンな、ロックされていない非ルート・ノードを除去し、関連付けられたＲＡＭを自由プールに戻すことにより、新たなノード用にキャッシュ内の空間を作ることを示すフローチャートである。
【図３２】再帰的に、特定のノード及びその子全てをキャッシュから除去し、ＲＡＭをＲＡＭ自由プールに戻し、任意的には、ディスク空間をディスク自由プールに戻すことを示すフローチャートである。
【図３３】修正されたノードをディスクに書き込み、それにより、クリーンなノードを作成することを示すフローチャートである。
【図３４】本明細書及び特許請求の範囲記載の方法論の何れか１つ又は複数をマシンに行わせるための命令の組を実行することが可能なコンピュータ・システムの例示的な電子的形態におけるマシンのコンピューティング装置の模式図表現を示す図である。
【発明を実施するための形態】
【００１３】
以下の詳細な説明は、詳細な説明の一部を構成する添付図面への参照を含む。図面は、例示的な実施形態による例証を示す。本明細書において「実施例」としても表す前述の例示的な実施形態は、本願の主題を当業者が実施することを可能にするために十分な詳細で説明している。実施形態を組み合わせることが可能であり、他の実施形態を利用することが可能であり、又は、特許請求の範囲記載の範囲から逸脱しない限り、構造的、論理的、及び電気的変更を行うことが可能である。したがって、以下の詳細な説明は、限定的な意味合いで解されないものとし、本開示の範囲は特許請求の範囲及びその均等物によって画定される。
【００１４】
本明細書及び特許請求の範囲記載の手法は、高速であり、かつ効率的な不揮発性キー値記憶装置を作成することを可能にし、各キーは固定長暗号ハッシュであり、値は任意の値である。固定長ハッシュ値は、何れかの長さのストリングを入力としてとり、固定長値を生成するよう企図された固定長暗号ハッシュ関数によって生成される。固定長暗号ハッシュは、各固定長暗号ハッシュ値が一意の値を有する可能性を最大にする暗号ハッシュ関数を使用して導き出すことが可能である。更に、一部の実施形態では、ハッシュ関数への入力が同様であっても、ハッシュ値の明白なグルーピングが存在しないようなランダムなハッシュ分布をもたらす暗号ハッシュ関数を使用して、固定長暗号ハッシュを導き出すことが可能である。
【００１５】
キー値記憶装置は、スキーマなしの態様でアプリケーションがそのデータを記憶することを可能にする。データは、オブジェクト又はプログラミング言語のデータタイプに記憶することが可能である。キー値記憶装置は、何れの外部ソフトウェア又はアプリケーションについての値もオペークに処理し、一般に、キー値記憶装置は、受け取った如何なる値も記憶し、対応する取り出し要求が受け取られると、値の同一の複製を返す。更に、単一のキーは、同じキーを有する各値が別のデータベース・ルート下で記憶されるように複数の値を有し得る。
【００１６】
多数のキー値対を記憶し、管理することができるデータ構造を構築することが可能であり、キーは全て、例えばＭＤ５、ＳＨＡ−１、ＳＨＡ−２、ＳＨＡ−３、タイガー（Ｔｉｇｅｒ）等などの固定長暗号ハッシュである。
【００１７】
本明細書及び特許請求の範囲記載の手法は、利用可能なランダム・アクセス・メモリ（ＲＡＭ）によって限定されない一方、下にある不揮発性記憶装置において利用可能な空間によって限定されて、多数のキーを処理し、キーの数が利用可能なＲＡＭをはるかに超える場合にも高速であることを意図している。一部のタイプの不揮発性記憶媒体は、限定列挙でないが、ハード・ドライブ、ユニバーサル・シリアル・バス（ＵＳＢ）サム・ドライブ、ソリッド・ステート・ドライブ（ＳＡＴＡ／ＳＡＳ／ＰＣＩｅ／等）、バッテリ・バックアップされたＲＡＭ等を含む。記憶装置が不揮発である旨の要件は厳密でなく、不揮発性記憶装置が、揮発性記憶装置で置き換えられた場合、それに記憶されたデータベースにより、電源障害が克服されなくなる。
【００１８】
本明細書及び特許請求の範囲記載の手法の種々の構成は、限定列挙でないが、キーに関連付けられた１つ又は複数のキーを記憶する工程、キーに関連付けられた値を取り出す工程、データベースからキー及び値を除去する工程、キーがデータベース内にあるかを判定する工程、考えられるキー全てのサブ範囲内のキーを求めてデータベースをサーチする工程、キーをソートする工程、順番にキー及び値を取り出す工程、キーに関連付けられた旧い値を新たな値で置き換える工程、データの喪失なしで、電源喪失などの障害から回復する工程、並びに、下にある記憶装置によってもたらされる破損を検出する工程を含む。
【００１９】
例示的なハッシュ・データベース（ＨＤＢ）（すなわち、本明細書及び特許請求の範囲記載の「キー値データベース」）データ構造（すなわち、トライ・ノード及びハッシュ・テーブル）は、ＨＤＢインタフェース及びアルゴリズム（ＨＤＢ作成及びキー値挿入、並びにハッシュ・テーブル・バースティングなど）と、階層キャッシュ・インタフェース及びアルゴリズムとを含み得る。
【００２０】
本書類を通して、「ディスク」の語は、下にある不揮発性記憶装置の略語として使用され、この装置が提供する抽象的なインタフェース（すなわち、このＨＤＢがその上に記憶するオブジェクトをロードし、保存し、上記オブジェクト用に空間を割り当て、上記オブジェクトに対する持続ハンドルを作成する機能）を規定する。新たなオブジェクトを作成し、又は既存のオブジェクトを修正する特定のＨＤＢ動作が首尾良く行われると、ディスクは、変更を持続させたことが保証され、よって、保存と、対応するロードとの間で（電源障害などの）障害イベントが生じた場合でも、後続ロードは各オブジェクトの最後の状態を返す。ディスク管理ソフトウェアは、ソリッドステート・アロケータ（Ｓｏｌｉｄｓｔａｔｅ  Ａｌｌｏｃａｔｏｒ）として表す。これは以下に更に詳細に説明する。
【００２１】
ＨＤＢ及びソリッドステート・アロケータは、シリアル・アドバンスド・テクノロジ・アタッチメント（ＳＡＴＡ−ＩＩＩ）や、ＰＣＩｅ接続ソリッド・ステート・ドライブ（ＳＳＤ）などのソリッド・ステート記憶装置とともに利用し得る。しかし、手法は何れかの特定の記憶装置にも限定されない。
【００２２】
既に上述したように、本明細書及び特許請求の範囲記載の手法は、利用可能なＲＡＭよりもずっと大きなデータセットを管理することを可能にし得、したがって、サブシステムとしての効率的なキャッシュ手法を含み得る。例えば、最近最も使用されていない（ＬＲＵ）キャッシング・アルゴリズム又は階層ＬＲＵキャッシング・アルゴリズムを使用することが可能である。キャッシュ動作はカプセル化し得るので、キャッシュ手法は、全体のプロセス・フロー、又は高レベルＨＤＢ手法を変えることなく、変わり得る。
【００２３】
本明細書及び特許請求の範囲記載のＨＤＢは、暗号ハッシュに関連付けられた値を記憶し、取り出すデータベースである。ＬＲＵキャッシュは、先頭において最近最も使用されておらず、末尾において最近最も使用されている順にソートされたキューとして本書類を通じてモデリングされる。Ｌｅｎｇｔｈ（ｘ）は、ｘ個のキューにおける要素の数である。
【００２４】
キュー（ＬＲＵキャッシュ）は、
ｘ＝ｑ．ｈｅａｄ（）  ｑにおける最初のアイテムを、それを除去することなく返す
ｘ＝ｑ．ｄｅｑｕｅｕｅ（）  ｑにおける最初のアイテムを、処理においてそれを除外して返す
ｑ．ｅｎｑｕｅｕｅ（ｘ）  ｑにおける最後のアイテムとしてｘを追加する
ｑ．ｒｅｍｏｖｅ（ｘ）  その位置にかかわらず、ｑからｘを除外する
ｌｅｎｇｔｈ（ｑ）  ｑ個のキューにおける要素の数
のように定義することが可能である。
【００２５】
更に、本明細書及び特許請求の範囲記載のディスク・アドレスは、ディスクによって提供されるオペーク・アドレスである。前述のアドレスに書き込まれる最後のデータは、電力サイクル後であっても後続読み出し動作中に返されることが保証される。
【実施例】
【００２６】
以下では、階層データ構造を生成し、管理する方法及びシステムに関する種々の実施形態の詳細な説明を提供する。
【００２７】
次に図面を参照するに、図１は、ＨＤＢを管理する種々の手法の実現に適したコンピューティング環境１００を示す。コンピューティング環境１００はコンピューティング・システム１１０及びメモリ１２０を備え得る。一般に、コンピューティング・システム１１０及びメモリ１２０は互いに結合され、互いにデータを送信することができる。一部の実施形態では、コンピューティング・システム１１０及びメモリ１２０は、単一のコンピュータ内に一体化し得、又は、相互接続されたコンピューティング・リソースを含み得る。メモリ１２０は、何れのタイプのものでもよく、揮発性メモリ及び不揮発性メモリ（例えば、リードオンリ・メモリ（ＲＯＭ）、ランダム・アクセス・メモリ（ＲＡＭ）、ダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）、ＮＡＮＤフラッシュ・メモリ、ＮＯＲフラッシュ・メモリ、ソリッドステート・ディスク（ＳＳＤ）、シリアル・アドバンスド・テクノロジ・アタッチメント（ＳＡＴＡ）ＳＳＤ等）を含み得る。
【００２８】
コンピューティング・システム１１０は、キー値データベースのハッシュ・テーブルのバースティングを行うシステム１３０を含む。キー値データベースのハッシュ・テーブルのバースティングを行うシステム１３０は通信モジュール１４０及び処理モジュール１５０を含み得る。通信モジュール１４０は、キー、及びキーに関連付けられた値を受け取り得、キー、及びキーに関連付けられた値を、更なる処理のために処理モジュール１５０に送信する。処理モジュール１５０は、本明細書及び特許請求の範囲記載の種々の方法を実現し得る。
【００２９】
図２は、一部の実施形態により、キー値データベースのハッシュ・テーブルのバースティングを行う、コンピュータによって実現される方法２００を示す例示的なプロセス・フローチャートである。方法２００は、ハードウェア（例えば、専用ロジック、プログラマブル・ロジック、マイクロコード等）、（汎用コンピュータ・システム上又は専用マシン上で実行されるソフトウェアなどの）ソフトウェア、又は両方の組み合わせを備え得る処理ロジックによって行い得る。例示的な一実施形態では、処理ロジックは図１に示すシステム１３０に存在している。
【００３０】
方法２００は、通信モジュール１４０がキー、及びキーに関連付けられた値を受け取る動作２０２で始まり得、プレフィックス及びサフィックスにキーを再帰的に分けることにより、処理モジュール１５０が、キー値データベースのトライ・ノードをルート・ノードから（ハッシュ・テーブルを含む）リーフ・ノードまで辿る動作２０４に進む。動作２０６では、ハッシュ・テーブルであるキー値データベースのリーフ・ノードに達し得る。動作２０８では、キーがキー値データベースに記憶されていないと判定し得る。方法は次いで、ハッシュ・テーブルがキー及び値を記憶することができない旨を判定する動作２１０に進み得る。これが判定されると、ハッシュ・テーブルを動作２１２で除去し得る。除去後、動作２１４で新たなトライ・ノードはハッシュ・テーブルの親トライ・ノードと関連付け得、動作２１６で２つ以上の新たなハッシュ・テーブルを新たなトライ・ノードと関連付け得る。動作２１８では、キー及び関連付けられた値は全て、２つ以上の新たなハッシュ・テーブルに動作２１２において除去されたハッシュ・テーブルから移動させ得る。方法は、適切な新たなハッシュ・テーブルに、キー及び関連付けられた値を挿入する動作２２０で終了し得る。
【００３１】
図３は、例示的なトライ・ノード及びハッシュ・テーブル、並びにＨＤＢ３００内のそれらの関係を示すブロック図である。図示するように、ＨＤＢ３００は２つのタイプのオブジェクト（すなわち、トライ・ノード３１０及び３２０、並びにハッシュ・テーブル７００、８００、及び９００）を含み得る。ハッシュ・テーブルは３つの変形（すなわち、純粋なハッシュ・テーブル７００、ハイブリッド・ハッシュ・テーブル８００、及び半純粋なハッシュ・テーブル９００）を含み得る。ハッシュ・テーブル７００、８００、及び９００はキー値対、及び親トライ・ノード３２０へのポインタを記憶することが可能であり、トライ・ノード３１０及び３２０は、他のトライ・ノード、又はハッシュ・テーブルへのポインタを記憶することが可能である。図３に示すように、トライ・ノード３１０は、ハッシュ・テーブル９００及びトライ・ノード３２０へのポインタを記憶する。トライ・ノード３２０は、ハッシュ・テーブル７００及び８００へのポインタと、トライ・ノード３１０へのポインタとを記憶する。
【００３２】
ＨＤＢ３００は、ハッシュ・テーブル７００、８００、及び９００からのキー値対を、順番にソートされたキーを維持する一方で、挿入し、サーチし、及び除去する機能を提供し得る。ハッシュ・テーブル７００、８００、及び９００は、実際のキー値対を記憶することが可能であり、トライ構造の底部に配置される。トライ・ノードは、通常、キー値対を記憶せず、適切なハッシュ・テーブルを見つけるために使用されるキー・プレフィックスを間接的に記憶する。よって、キー値対は全て、ハッシュ・テーブルであるリーフ・ノードに記憶される。
【００３３】
上述したように、ハッシュ・テーブル７００は純粋なハッシュ・テーブルである。純粋なハッシュ・テーブル７００に達するために、単一のパスのみが存在している。このことは、ハッシュ・テーブル７００に記憶されたキー値対が全て、同じプレフィックス（この例では「６Ｂ」）で始まるということを意味している。１つのパスのみが存在している限り、ハッシュ・テーブルは、空きであっても純粋であり得る。
【００３４】
ハッシュ・テーブル８００は、ハイブリッド・ハッシュ・テーブルである。前述のノードには複数のパスが存在しているので、プレフィックスが同一でないキー値対を保持している。前述のハッシュ・テーブルがハイブリッドであるためには、プレフィックスが異なる少なくとも２つのキーが存在していなければならない。記憶されたキー値対が０個又は１個存在している場合、このハッシュ・テーブルは半純粋ハッシュ・テーブル（例えば、ハッシュ・テーブル９００）である。
【００３５】
ハッシュ・テーブル９００は、半純粋なハッシュ・テーブルである。前述のノードには複数のパスが存在しているが、ここに現在記憶されているキー値対が０個存在しているか、又は、ここに記憶されたキー値対が全て、同一のプレフィクスを有している（前述の例では「ＥＥＡ９」）。
【００３６】
図３に示すように、トライ・ノード３２０はルート・トライ・ノードである。ＨＤＢは、構成可能な数のルート・トライ・ノードを提供することが可能である。各ルート・トライ・ノードは、下にある同じ永続性記憶装置を共有し得る独立のデータベースである。ルートの数は初期化時点で構成することが可能である。ルートは更に、実行時に追加又は除去し得る。ハッシュ・テーブルのキーは、固定長暗号ハッシュである。
【００３７】
既存の解決策と対照的に、本明細書及び特許請求の範囲記載の手法により、データ構造及びデータを扱う方法は、同時にキャッシュを意識し、かつ、Ｉ／Ｏを意識するものである。上記手法は、各種の不揮発性メモリをサポートするためにＨＤＢにおける変更を必要としない汎用永続性記憶インタフェース層上に、又は特定のタイプのフラッシュ・メモリ上に展開し得る。
【００３８】
ＨＤＢにおける各ハッシュ・テーブルは、（５１２、４０９６、又は８１９２バイトなどの）最小ディスク又はフラッシュＩ／Ｏ容量の整数の倍数であるよう構成される。各ハッシュ・テーブルはアレイ・ハッシュを含み得、ハッシュ・テーブル内の各レコードは、キャッシュ・ライン・サイズの整数の倍数であるよう企図される。ノードは、オープン・アドレス法、線形探索モデルを使用して充填し、サーチし得る。オープン・アドレス法は、ハッシュ・テーブルにおける衝突解決の手法である。前述の手法により、目標レコードが見つかるか、又は、未使用のアレイ・スロットが見つかる（テーブル内に当該キーが存在していない旨を示す）までアレイ内の交互にくる位置にわたってサーチし、又は探索することによってハッシュ衝突が解決される。目標レコードを見つけるために種々の探索手法を使用することが可能であり、その一部の例には、線形探索、二次探索、ダブル・ハッシング、複数ハッシング・アルゴリズム等を含む。ハッシュ・テーブルを探索するために使用されるハッシュ関数は、キーである暗号ハッシュの「スライス」又はセグメントから得ることが可能である。探索の開始レコードは、
ｓｔａｒｔ＿ｒｅｃｏｒｄ＿ｎｕｍｂｅｒ＝ｓｌｉｃｅ＿ｔｏ＿ｉｎｔｅｇｅｒ（ｋｅｙ，ｓｔａｒｔ，ｓｔｏｐ）ＭＯＤＵＬＵＳ（ｎｕｍｂｅｒ＿ｏｆ＿ｒｅｃｏｒｄｓ）
の整数演算（すなわち、分数値なし）を行うことによって生成される。ここで、「ｓｔａｒｔ」及び「ｓｔｏｐ」は、（暗号ハッシュである）キーの開始バイト及びストップ・バイトのインデックスであり、「ｓｌｉｃｅ＿ｔｏ＿ｉｎｔｅｇｅｒ（）」は、ゼロ・コスト演算であるタイプ（値でない）の変換である。よって、キーは既に暗号ハッシュであるので、キーにわたる新たなハッシュを何ら計算することなく、キー自体の「スライス」又は特定セグメントのみがハッシュ値としての役目を担い得る。これは、本願の手法の効果的な原理の１つである。
【００３９】
値を求めるために、例示的な手法は、ハッシュ内のバイトをみることにより、キー値対までトライを辿ることが可能である。キーのプレフィックスは、ハッシュ・テーブルに達するよう辿るパスを示すようエンコードされるので、ハッシュ・テーブルに記憶されたキーから除外し、それにより、ハッシュに関連付けられた値のハッシュ・テーブルに、より多くの空間を残し得る。性能の理由で、各ハッシュ・テーブルのサイズは下にある記憶媒体の自然なアクセス・サイズ（すなわち、フラッシュ又はＳＳＤページ・サイズ）の整数倍数に等しいものであり得る。
【００４０】
一部の例示的な実施形態では、ハッシュ・テーブルは、バースティング前に１００％の負荷率に達することを可能にし得る。ハッシュ・テーブルが達することが許容される充填度は、調整可能なパラメータによって予め定め得る。
【００４１】
各種サーチをサポートすることが可能である。例示的なサーチ・タイプの１つは、方法が、ハッシュに関連付けられた値とともにＦＯＵＮＤを返すか、又は、ハッシュがデータベースにない場合にＮＯＴ−ＦＯＵＮＤを返して、単一のハッシュを提供する工程を含む。この場合、ハッシュ・テーブルのソート順序は、インタフェース外に露呈せず、よって、内部の順序付けは無関係である。
【００４２】
別の例示的なサーチ・タイプは、コールバック関数と、「開始」及び「終了」の２つのハッシュを備えた範囲マッチングが提供される。コールバック関数は、開始と終了との間のデータベース内のキー値対全てについてゼロ回以上、コールされる。コール毎に、少なくとも１つのキー値対を受け取るが、２つ以上を受け取り得る。キー値対は、部分的に順序付けてコールバック関数に送出し得る。後続する呼び出しには、先行するコールに与えられるキー値対後にくるキー値対が与えられることが保証される。複数のキー値対がコールバックの呼び出しに送出されると、そのグループ内で保証される更なる順序付けは存在しないことがあり得る。コールバック関数は、一度に、１個のハッシュとＮ個のハッシュとの間で与え得、ここで、Ｎは、単一のハッシュ・テーブル内のキー値対の最大数に上限が設けられる。
【００４３】
図４は、例示的なノード・ヘッダ４００を示すブロック図である。トライ・ノード及びハッシュ・テーブルは何れも、オブジェクトのタイプ（トライ・ノード又はハッシュ・テーブル）を識別し、オブジェクトの外部記憶位置を識別し、一貫性チェック機構を提供する役目を担うノード・ヘッダ４００で始まる。更に、ノード・ヘッダ４００は、オブジェクトとその親との間の関係を表し、オブジェクトに関連付けられた余分な状態を追跡する。
【００４４】
図４に示すように、ノード・ヘッダ４００は、ＣＲＣ（巡回冗長性検査）フィールド４１０、フラッグ・フィールド４２０、ノード・タイプ・フィールド４３０、親連結インデックス・フィールド４４０、ディスク・アドレス・フィールド４５０、親アドレス・タイプ・フィールド４６０、及び親アドレス・フィールド４７０を含み得る。
【００４５】
フラッグ・フィールド４２０は、メモリ・キャッシュ状態を追跡するために使用される、「ダーティーな」、「ロックされた」、「キャッシュされた」、「連結された」、「ルートである」などの種々のフラグを表し、記憶し得る。ノード・タイプ・フィールド４３０は、トライ・ノード又はハッシュ・テーブルとして包含ノードを識別する。親連結インデックス・フィールド４４０は、親トライ・ノード内のどの「子アドレス」アレイ・エントリがこのノードを指し示しているかを識別するために使用し得る。ディスク・アドレス・フィールド４５０は、前述のオブジェクトに関連付けられたデータを記憶するディスク上の位置を指定するために使用し得る。親アドレス・タイプ・フィールド４６０は親アドレス・フィールド４７０を解釈するために使用し得、親アドレス・タイプ・フィールド４６０は通常、２つの値（すなわち、「ＲＡＭ内」及び「ディスク上」）の一方を有し得る。ディスク上に記憶された前述のオブジェクトの複製では、親アドレス・タイプ・フィールド４６０は「ディスク上」にセットされ、親アドレス・フィールド４７０は親のディスク・アドレスにセットされる。前述のオブジェクトの複製がＲＡＭに記憶されると、親アドレス・タイプ・フィールド４６０は、親トライ・ノードも「ＲＡＭ内」である場合に「ＲＡＭ内」にセットし、親がディスク上にある場合に「ディスク上」にセットし得る。前述のオブジェクトの複製がＲＡＭに記憶されると、親アドレス・フィールド４７０は、親もＲＡＭ内にある場合に親ノードのＲＡＭアドレスにセットし、親がＲＡＭ内にない場合に親のディスク・アドレスにセットし得る。
【００４６】
図５は例示的なトライ・ノード５００を示すブロック図である。トライ・ノードは、キーのみのＮ個のビットのプレフィックスのみをデコードし得るノードであり、ここで、Ｎは０乃至パラメータ「ｌｅｎｇｔｈ＿ｉｎ＿ｂｉｔｓ＿ｏｆ＿ｔｈｅ＿ｋｅｙ」（例えば、０乃至２５６）から選択される。最大ｌｅｎｇｔｈ（Ｋｅｙ）個のレベルのトライ・ノードが存在し得、ここで、ｌｅｎｇｔｈ（Ｋｅｙ）はキー内のバイトの数である。図５に示すように、トライ・ノード５００は、（図４を参照して上述した）ノード・ヘッダ４００、子連結インデックス・フィールド５１０、アドレス・タイプ・フィールド５２０、及び子アドレス・フィールド５３０を含み得る。子連結インデックス・アレイ・フィールド５１０は、１乃至Ｎ個の、子アレイ要素のインデックスを収容し、子アドレス・アレイ内の対応するレコードにキー・プレフィクスを変換するために使用される。指し示される子は、そのプレフィックスを備えたキー全てを収容する。子がハッシュ・テーブルである場合、前述のアレイの多くの（１…Ｎの）要素はそれを参照し得、その場合、ハッシュ・テーブルは、一致するプレフィクス全てを備えるキー値対を収容する。子は、トライ・ノードである場合、子連結インデックス・アレイからの単一の参照を有し得るに過ぎない。すなわち、純粋なハッシュ・テーブル７００は、それを参照する単一のレコードを子連結インデックス・アレイ５１０に有する一方、ハイブリッド・ハッシュ・テーブル８００及び半純粋なハッシュ・テーブル９００は、それらを参照する２つ以上のレコードを有する。
【００４７】
アドレス・タイプ・フィールド５２０は、別々の２つの値（すなわち、「ディスク上」及び「ＲＡＭ内」）を収容し得る。ノードのディスク複製は、アドレス・タイプ・フィールド５２０を「ディスク上」にセットさせる。ノードのディスク複製がＲＡＭ内にある場合、アドレス・タイプ・フィールド５２０は、子がＲＡＭ内にあるか否かに依存する。よって、子がＲＡＭ内にある場合、アドレス・タイプ・フィールド５２０は「ＲＡＭ内」である。一方、アドレス・タイプ・フィールド５２０がディスク上にある場合、アドレス・タイプ・フィールド５２０は「ディスク上」である。
【００４８】
アドレス・タイプ５２０及び対応する子アドレス５３０の各対は子アドレス・レコード５４０を構成する。子アドレス・レコードのアレイは子アドレス・アレイ５５０としてみなし得る。
【００４９】
ディスク上にあるノードの複製では、子アドレス５３０は、子ノードのディスク上アドレスにセットされる。ＲＡＭ内にあるノードの複製においては、子アドレス５３０は、子ノードもＲＡＭ内にある場合、子アドレス５３０も子のＲＡＭアドレスにセットし得る。更に、子アドレスは、フリーであるとして子ノードにマーキングするために使用される特殊アドレスを収容し得る。
【００５０】
図６は、例示的なハッシュ・テーブル・ノード６００を示すブロック図である。ハッシュ・テーブル・ノード６００は、リーフ・ノードであり、したがって、子ノードを何ら有しない。ハッシュ・テーブル・ノード６００は、キャッシュを意識したハッシュ・テーブル内に構成可能な数のキー値対を収容する。図６に示すように、ハッシュ・テーブル・ノード６００は、（図４を参照して上述した）ノード・ヘッダ４００と、使用中バケット数フィールド６１０と、ハッシュ・テーブル・ノードを指し示す親の子連結インデックスにおけるエントリの数に関するフィールド６２０と、使用中バケット・ビットマップ・フィールド６３０と、キー・アレイ６４０と、対応する値のアレイ６５０とを含み得る。使用中バケット数フィールド４１０は、現在使用中のハッシュ・バケットの数を表す。バースティングのためにハッシュ・テーブルの「充填度」を追跡し得る。フィールド６２０は、このハッシュ・テーブル６００を指し示す親トライ・ノード内のいくつかの子の数を提供し得る。使用中バケット・ビットマップ・フィールド６３０では、位置ｉにおけるセット・ビットは、バケットｉが有効なキー及び値を有している旨を示す。クリア・ビットは、バケットが空き／利用可能状態にあることを意味している。キー６４０及び値６５０は、ハッシュ・テーブル６００に記憶された対応するバケットの一部である。
【００５１】
図７は、例示的な純粋なハッシュ・テーブル７００を示すブロック図である。上述したように、純粋なハッシュ・テーブル７００に達するために単一のパスのみが存在している。よって、親の参照の数は１である。すなわち、純粋なハッシュ・テーブル７００は、フィールド６２０が１に等しいハッシュ・テーブル６００である。更に、ハッシュ・テーブル７００に記憶されたキー値対は全て、同じプレフィックスで始まる。バケット６６０は、０乃至Ｎ個のキー値対を含み得る。キーは、例えば、ＳＨＡ−１、ＳＨＡ−２、ＳＨＡ−３、ラビン（Ｒａｂｉｎ）等などの暗号ハッシュを含み得る。対応する値０乃至Ｎは、特定のキーに関連付けられたオペーク・データを含み得る。ＨＤＢは、値を解釈しないことがあり得、単にそれを記憶し、取り出す。
【００５２】
純粋なハッシュ・テーブル７００は、図６を参照して説明したものと同様な使用中バケット数フィールド６１０及び使用中バケット・ビットマップ・フィールド６３０を有し得る。
【００５３】
図８は、例示的なハイブリッド・ハッシュ・テーブル８００を示すブロック図である。ハイブリッド・ハッシュ・テーブル８００には複数のパスが存在し、よって、親の参照の数は２乃至Ｎであり得る。ハイブリッド・ハッシュ・テーブルはハッシュ・テーブル６００のインスタンスであり、ここで、フィールド６２０は、２乃至Ｎに等しく、別々のプレフィクスを有する少なくとも２つのキーを収容する。バケット６６０は、別々のプレフィックスの最後のバイトが同一でないキー値対を含む。
【００５４】
ハイブリッド・ハッシュ・テーブル８００は、図６を参照して説明したものと同様な使用中バケット数フィールド６１０及び使用中バケット・ビットマップ・フィールド６３０を更に有し得る。更に、上述したように、ハイブリッド・ハッシュ・テーブル８００に記憶されたキー値対は全て、別々のプレフィックスで始まり得る。キーは、例えば、ＳＨＡ−１、ＳＨＡ−２、ＳＨＡ−３、ラビン（Ｒａｂｉｎ）等などの暗号ハッシュを含み得る。
【００５５】
図９は、例示的な半純粋なハッシュ・テーブル９００を示すブロック図である。半純粋なハッシュ・テーブル９００への複数のパスが存在しており、したがって、親の参照の数は２乃至Ｎであり得る。バケット６６０に記憶されたキー値対は全て、同一の対を有していなければならず、さもなければテーブルはハイブリッド・ハッシュ・テーブルとなる。同様に、半純粋なハッシュ・テーブル９００は、図６を参照して説明したものと同様な使用中バケット数フィールド６１０及び使用中バケット・ビットマップ・フィールド６３０を更に有し得る。
【００５６】
更に、純粋なハッシュ・テーブル９００に記憶されたキー値対は全て、同じプレフィックスで始まる。
【００５７】
上述したように、キーは暗号ハッシュを含み得る。暗号ハッシュの例には、ＳＨＡ−１、ＳＨＡ−２、ＳＨＡ−３、ラビン等が含まれる。
【００５８】
半純粋なハッシュ・テーブル９００は、２つ以上のプレフィックスを有する少なくとも１つのキーを収容すると直ちにハイブリッド・ハッシュ・テーブル８００に変換することが可能である。半純粋なハッシュ・テーブル９００が０個又は１個のキーを有する場合、純粋なハッシュ・テーブルに変換することが可能である。
【００５９】
図１０は、新たな暗号キー値データベースを生成する方法１０００を示すフローチャートである。方法１０００は、多数のキー値対を効率的に記憶し、サーチし、修正し、削除する機能を備えた新たな、空き状態の永続性データベースを作成する。キー値対の数は、下にある永続性記憶媒体のサイズによってのみ制限される。各データベース・ルートは、キーに関連付けられた単一の値を記憶することが可能である。入力の１つであるｎｕｍ＿ｒｏｏｔｓパラメータは、特定のＨＤＢインスタンスがサポートする独立したキー空間の数を規定する。方法１０００は、空きのトライ・ノードを作成する。方法１０００は、プレフィックス及びサフィックスにキーを分けることが可能である。プレフィックスは、子を選択するために使用される。子がトライ・ノードである場合、サフィックスは、新たなプレフィックス及びサフィックスに分けられ、選択は新たなプレフィックスで反復する。（ハッシュ・テーブルである）リーフに達すると、方法１０００は終了する。方法１０００は、例として、動作１００２乃至１０２８を参照して示す。
【００６０】
図１１は、新たなキー値対をＨＤＢへ挿入する方法１１００を示すフローチャートである。方法１１００は、（ハッシュ・テーブルである）リーフが見つかるまで実行し得る。ハッシュ・テーブルが見つからなかった場合、新たなハッシュ・テーブルが作成され、適切な親ノードに取り付けられる。その後、新たなキー値対が新たなハッシュ・テーブルに挿入される。方法１１００は、リーフがハッシュ・テーブルであるか否かを判定し得る。リーフがハッシュ・テーブルである場合、ハッシュ・テーブルをサーチすることが可能である。キーが見つかった場合、２つの選択肢（すなわち、旧い値を新しい値と置き換えること、及びエラーを返すこと）が存在し得る。キーが見つからず、かつ、ハッシュ・テーブルが新たなキー値対用の空間を有する場合、方法１１００は新たなキー値をハッシュ・テーブルに挿入し得る。一方、キーが見つからず、ハッシュ・テーブルが新たなキー値対用の空間を有していない場合、方法１１００は、新たなトライ・ノード、及び新たなトライ・ノードの子の２つ以上のハッシュ・テーブルへの、ハッシュ・テーブルのバースティングを行い、確実に、新たなハッシュ・テーブルの１つが新たなキー値対に収まることができるようにし得る。
【００６１】
上述したバースティング機構は、旧いハッシュ・テーブルをトライから取り外し、その代わりに、新たなトライ・ノードを取り付け、新たなトライ・ノードの子として少なくとも２つの新たなハッシュ・テーブルを作成し、旧いハッシュ・テーブルからのキー値対を、正しい新たなハッシュ・テーブルに移動させ、新たなキー値対を正しい新たなハッシュ・テーブルに挿入し、旧いハッシュ・テーブルを解放し得る。他のＨＤＢ手法（例えば、削除及びサーチ）は同様である。方法は、データセットが、利用可能なＲＡＭに収まらず、よって、制限された、記憶装置に対するＩ／Ｏ帯域幅及び記憶装置のＩＯＰＳを効率的に使用する一方で、特定の動作を実行するために方法が必要とし得る部分とともにＲＡＭにロードしなければならないということによって複雑になり得る。このことは、ＲＡＭ内に効果的なキャッシュを維持し、更に、方法が必要とするデータが既にＲＡＭにある訳でないか、又は、新たなデータを読み込むための空間を作るために若しくは電源喪失の場合になんらかの類の一貫性を方法が保証する必要があることが理由で何かを書き出さなければならない場合に、下にある記憶装置の最適な使用のために方法を調節することを意味する。方法１１００は、例として、動作１１０２乃至１１４５を参照して示す。
【００６２】
図１２は、ＨＤＢの高レベル・バースティングのための方法１２００を示すフローチャートである。特に、方法１２００は、図１１上の動作１１２８からコールされるにつれ、トライ・ノードのバースティングを行うために使用される。方法１２００は、どのタイプのハッシュ・テーブル（純粋、ハイブリッド、又は半純粋）のバースティングを行い、ハッシュ・テーブル・タイプ毎にバースティングを行う対応するアルゴリズムをコールする必要があるかを判定する（図１３、図１４、図１５、及びそれらの対応する説明参照）。
【００６３】
方法１２００は単純な形態で説明しているが、実際の実現形態では、まれな場合にリソース集約的動作であり得、よって、可能な場合に避けられるプレフィックスの同等性についての別個のサーチなしで、ハッシュ・テーブルが半純粋なハッシュ・テーブルであるかハイブリッド・ハッシュ・テーブルであるかについての先験的知識によって生じる最適化が存在し得る。方法１２００は、例として、動作１２０２乃至１２１４を参照して示す。
【００６４】
図１３は、純粋なバースティングのための方法１３００を示すフローチャートである。図示したように、（動作１３３０までの）上部は新たなサブトライを作成し、後半（動作１３３０乃至１３４６）は旧いハッシュ・テーブルを切断し、その代わりに新たなサブトライを連結し、旧いハッシュ・テーブルをキー値対から退出させて新たなサブトライに移動させ、最終的に、空き状態のハッシュ・テーブルを廃棄する。
【００６５】
方法１３００が完了した後、ブロック１３０８に示す整数パラメータ「ＮＵＭ＿ＨＴＡＢ＿ＴＯ＿ＢＵＲＳＴ＿ＩＮＴＯ」が１よりも大きい限り、呼び出し元には、サブトライに、一致するプレフィックスを有する新たなキーを適合させることができることが保証される。パラメータは、性能、並びにメモリ及びディスク利用度に対する影響を与える、新たに作成されたハッシュ・テーブルのデフォルト疎性を変えるよう利用することが可能である。一般に、方法１３００は、親トライからハッシュ・テーブルを切断し、その代わりに新たなサブトライを連結させ、旧いｈｔａｂからキー値対全てを退出させ、新たなサブトライに移動させ、（今は空きの）ハッシュ・テーブルを廃棄する動作を行う。方法１３００は、例として、動作１３０２乃至１３４６を参照して示す。
【００６６】
図１４は、半純粋なバースティングのための方法１４００を示すフローチャートである。開始時には、ハッシュ・テーブル内のキーは全て、単一のプレフィックスを有する一方、親は、２つ以上の子に連結させたこのハッシュ・テーブルを有する（すなわち、少なくとも２つの別々のキー・プレフィックスのデスティネーションである一方、ハッシュ・テーブル内のキーは全て、同じプレフィックスを有する）。方法１４００は、新たなハッシュ・テーブルを作成し、新たな、空き状態のハッシュ・テーブルを指し示すよう、ハッシュ・テーブル内のキー全てが始まる単一のプレフィックス以外はプレフィックス全てを移動させる。これは、ハッシュ・テーブルを純粋なハッシュ・テーブルに変換し、新たなハッシュ・テーブルを純粋なハッシュ・テーブル又は半純粋なハッシュ・テーブルに変換する。方法１４００は、例として、動作１４０２乃至１４１８を参照して示す。
【００６７】
図１５は、ハイブリッド・バースティングのための方法１５００を示すフローチャートである。方法１５００は、ハッシュ・テーブルに新たなキー値対を入れるよう空間を解放し得る。一致するキー・スライス（「ｋｓｌｉｃｅ」）値を有するキー値対は全て、ハッシュ・テーブルにおいて維持される一方、他のｋｓｌｉｃｅ値を有するキー値対は除去の候補である。図示したような方法１５００は、より高価かつ複雑な選択肢の一部を無視し得る。例えば、方法１５００が、別のｋｓｌｉｃｅを有するキー値対を見つけた場合、既に作成されたものが多すぎない限り、それをその中に移動させるその新たな純粋なハッシュ・テーブルを作成することを試行する。（場合によっては、別のハッシュ・テーブルのバースティング、又はトライを辿ることをもたらすので）このキー値対を移動させることが高価すぎる場合、方法１５００は、前述のｋｓｌｉｃｅ値を有するキー値対全てを飛ばし得る。
【００６８】
ハイブリッド・ハッシュ・テーブルはそれを指し示す子を少なくとも２つ有しているので、より高度な最適化なしでも、一致するキー値対を移動させるための少なくとも１つの新たな純粋なハッシュ・テーブルの作成が保証される。ハイブリッド・ハッシュ・テ―ブルが、キー・スライスに一致する同一のキー・プレフィックスを有するキー値対で満杯である場合に、このルールに対する唯一の例外が生じる。方法１５００が、それを移動させることができなくなるからであるが、前述の状況は、半純粋なハッシュ・テーブルを表し、そういうものとして、呼び出し元によって取り扱われる（図１２）。最大数の新たなハッシュ・テーブルが、メモリ及びディスクの利用度と、性能に影響を及ぼす調節可能なパラメータである。方法１５００は、例として、動作１５０２乃至１５４２を参照して示す。
【００６９】
図１６は、空き状態である新たなトライ・ノードを作成する方法１６００の作成を示すフローチャートである。方法１６００は、例として、動作１６０２乃至１６２２を参照して示す。
【００７０】
図１７は、新たなハッシュ・ノードを作成する方法１７００を示すフローチャートである。方法１７００は、特定の親トライ・ノードに連結された新たな、空き状態のハッシュ・テーブルを作成する。親の子連結インデックス・アレイ要素は何れもこの新たなハッシュ・テーブルを参照せず、前述の連結は呼び出し元によって作成される。方法１７００は、例として、動作１７０２乃至１７２６を参照して示す。
【００７１】
図１８は、キーがデータベース内に存在しているかを判定し、キーがデータベース内に存在している場合、キーに関連付けられた値を判定する方法１８００を示すフローチャートである。すなわち、複数のデータベース・ルートが存在している場合、このルーチンは、単一のルートをサーチし、そのルート内の値を返し、見つからなかった場合、ＮＩＬを返す。方法１８００は、例として、動作１８０２乃至１８３４を参照して示す。
【００７２】
図１９は、キー及びその関連付けられた値のハッシュ・テーブルからの削除のための方法１９００を示すフローチャートである。方法１９００は、例として、動作１９０２乃至１９３２を参照して示す。
【００７３】
図２０は、ハッシュ・テーブル内の特定のキーの新たな値を挿入する方法２０００を示すフローチャートである。ハッシュ・テーブルが特定のキーの値を既に含んでいる訳でない場合に、方法２０００を使用し得る。方法２０００は、線形探索による、オープン・アドレス指定されたハッシュ・テーブルを示しているが、他の手法も好適に機能し得る。前述のタイプの表現は、ディスク／ＳＳＤへの直列化を、ＲＡＭ内でキャッシュ高効率にするとともに高速及び単純にし得る。
【００７４】
キーは、実質的に乱数である暗号ハッシュであり、好適に分布している。よって、動作２００６におけるハッシュ関数は、暗号ハッシュ、又は該ハッシュの部分集合を使用し、それにより、非常に低コストである（すなわち、高速である）ハッシュ・アルゴリズム（実質的に、単一整数剰余演算のコスト）がもたらされる。
【００７５】
ハッシュ関数２００６は、コンピュータが処理する効率的なネーティブ容量に打ち切られた暗号ハッシュのスライスを返す。例えば、それは３２ビットの数字であり、バケットの数でＭＯＤをとると、好適な分布を維持する。方法２０００は、例として、動作２００２乃至２０１４を参照して示す。
【００７６】
図２１は、キー及び対応する値をハッシュ・テーブルから削除する方法２１００を示すフローチャートである。方法２１００は、例として、動作２１０２乃至２１２２を参照して示す。
【００７７】
図２２は、ハッシュ・テーブル内の旧い値を新たな値で置き換える方法２２００を示すフローチャートである。ハッシュ・テーブルが既に特定のキーについて旧い値を含んでいると分かれば、方法２２００は旧い値を新しい値で置き換える。ハッシュ・テーブル探索モデルは、値をハッシュ・テーブルに挿入することと同様である。方法２２００は、例として、動作２２０２乃至２２２２を参照して示す。
【００７８】
図２３は、キャッシュ・キューを見つける方法２３００を示すフローチャートである。クリーンなノードは削除の対象となり得るが、最近アクセスされているか、又は、多くの子を有するクリーンなノードは、削除の好適な候補でない。子を有するノードを削除することは、子ノードも削除しなければならない（。さもなければ、子ノードは到達不能となり、よって、それに対してＲＡＭを費いやす理由は存在しない。）ハッシュ・テーブルは、子を何ら有しておらず、ノードの圧倒的過半数であるので、大半の削除済ノードは、最長期間の間、使用されていないハッシュ・テーブルとなる。ロックされたノードは、キャッシュから削除すべきでないノードである。現在の動作に必要であるからである。変更されているが、変更がディスクにまだ書き込まれていないため、ダーティーなノードは削除すべきでない。ルート・ノードは削除すべきでない。データベース動作は全て、ルートで始まるゆえ、直後の動作がもう一度ルートを必要とすることになるので、ルート・ノードを削除することは不必要な無駄となる。しかし、これは単に最適化であり、適切な動作にとって厳密な要件でない。
【００７９】
クリーンなキューは、トライ・ノードの考えられる数の子毎に１つのキューが存在しているようなサイズのキューのアレイである。例として、トライ・ノード毎の２５６個の子は、２５６個のクリーンなキューをもたらす。これは厳密な要件でない。同等に可能性が高いシナリオは、子の数の範囲を、細粒度がより高いバケットにまとめるものである。方法２３００は、例として、動作２３０２乃至２３２８を参照して示す。
【００８０】
図２４は、キャッシュにノードを挿入する方法２４００を示すフローチャートである。方法２４００は、余地を与えるために１つ又は複数の旧いノードを場合によっては削除して、動作２４０２において与えられたノードをキャッシュに入れる。方法２４００は、例として、動作２４０２乃至２４１８を参照して示す。
【００８１】
図２５は、キャッシュからノードを削除する方法２５００を示すフローチャートである。方法２５００は、例として、動作２５０２乃至２５１４を参照して示す。
【００８２】
図２６は、ディスクからノードをロードし、それをキャッシュへ追加する方法２６００を示すフローチャートである。方法２６００は、例として、動作２６０２乃至２６１８を参照して示す。
【００８３】
図２７は、修正されているとして、動作２７０２において与えられたノードにマーキングし、それをクリーンなキャッシュからダーティーなキャッシュに移動させる方法２７００を示すフローチャートである。方法２７００は、例として、動作２７０２乃至２７１４を参照して示す。
【００８４】
図２８は、ノードを、ロックされたキャッシュに移動させることにより、削除することができないとしてノードをロックする方法２８００を示すフローチャートである。方法２８００は、削除することができないとしてノードにマーキングすることが可能である。多くのデータベース動作は、２つ以上のノードを処理するので、このことは、より多くの空間が必要な場合に、処理されているノードが削除されないことを確実にする。方法２８００は、例として、動作２８０２乃至２８１６を参照して示す。
【００８５】
図２９は、ロックされたキャッシュから退出させてもう一度適切なクリーンなキャッシュに移動させることにより、ノードをロック解除する方法２９００を示すフローチャートである。方法２９００は、ノードを、ロックされたキャッシュから退出させて、それがその時点で属する何れかのキャッシュ（ルート・キャッシュ、ダーティーなキャッシュ、又はクリーンなキャッシュ）にもう一度移動させ得る。方法２９００は、例として、動作２９０２乃至２９１４を参照して示す。
【００８６】
図３０は、ロックされたキャッシュのノード全てをもう一度、それらそれぞれのキャッシュに移動させる方法３０００を示すフローチャートである。方法３０００は、ノード全てを、ロックされたキャッシュから退出させて、それらがその時点で属する何れかのキャッシュ（ルート・キャッシュ、ダーティーなキャッシュ、又はクリーンなキャッシュ）に移動させる。方法３０００は、例として、動作３００２乃至３０１４を参照して示す。
【００８７】
図３１は、キャッシュから１つ又は複数の、クリーンな、ロックされていない非ルート・ノードを除去し、関連付けられたＲＡＭを自由プールに戻すことにより、新たなノード用に空間を作る方法３１００を示すフローチャートである。必要な空間を規定するパラメータは、少なくとも１つの新たなノード用に空間を作るのに十分大きくなければならない一方、一度により多くの自由空間を作るためにより大きいものであり得る。方法３１００は、例として、動作３１０２乃至３１２６を参照して示す。
【００８８】
図３２は、再帰的に、特定のノード及びその子全てをキャッシュから除去し、任意的には、データベースからのノード、特定のノード及びその子全てを完全に除去する方法３２００を示すフローチャートである。方法３２００は、再帰的に、特定のノード及びその子全てに関連付けられたＲＡＭをキャッシュから除去し、解放する。ノードは全て、クリーンであり、ロックされていない状態にあるべきである。更に、この要件を満たさないエラー処理は示していない。ディスクからの解放が必要な場合、方法３２００は、更に、ディスク上の複製を削除し、自由プールに返し得る。方法３２００は、例として、動作３２０２乃至３２３６を参照して示す。
【００８９】
図３３は、修正されたノードをディスクに書き込み、それにより、クリーンなノードを作成する方法３３００を示すフローチャートである。方法３３００は、ダーティーなノード全てをディスクに書き込み、その過程でそれらを、クリーンなノードにする。方法３３００は、例として、動作３３０２乃至３３２８を参照して示す。
【００９０】
図３４は、本明細書及び特許請求の範囲記載の方法論の何れか１つ又は複数をマシンに行わせるための命令の組を実行することが可能なコンピュータ・システム３４００の例示的な電子的形態におけるマシンのコンピューティング装置の模式図表現を示す図である。種々の例示的な実施形態では、マシンはスタンドアロン装置として動作するか、又は他のマシンに接続（例えば、ネットワーキング）することが可能である。ネットワーク化された展開では、マシンは、クライアントサーバ・ネットワーク環境におけるサーバ又はクライアント・マシンとして、又は、ピアツーピア（若しくは分散）ネットワーク環境におけるピア・マシンとして動作することが可能である。マシンは、サーバ、パソコン（ＰＣ）、タブレットＰＣ、セットトップ・ボックス（ＳＴＢ）、ＰＤＡ，セルラ電話機、ディジタル・カメラ、ポータブル音楽プレイヤ（例えば、動画像専門家グループ・オーディオ層３（ＭＰ３）プレイヤなどのポータブル・ハード・ディスク・オ―ディオ装置）、ウェブ家電製品、ネットワーク・ルータ、スイッチ、ブリッジ、又は、当該マシンによって行う対象の動作を規定する（シーケンシャルの、又はそれ以外の）命令の組を実行することができる何れかのマシンであり得る。更に、単一のマシンのみを示しているが、「マシン」の語は更に、本明細書及び特許請求の範囲記載の方法論の何れか１つ又は複数を行うための命令の組（若しくは複数の組）を個々に、又は一緒に実行するマシンの何れかの収集物を含むと解される。
【００９１】
例示的なコンピュータ・システム３４００は、バス３４０２を介して互いに通信し合う１つ又は複数のプロセッサ３４０２、ハード・ディスク・ドライブ３４０４、主メモリ３４０６、及びスタティック・メモリ３４０８を含む。コンピュータ・システム３４００は更に、ネットワーク・インタフェース装置３４１２を含み得る。ハード・ディスク・ドライブ３４０４は、本明細書及び特許請求の範囲記載の方法論又は機能の何れか１つ又は複数を実施するか、又は上記何れか１つ又は複数によって利用される命令３４２０の１つ又は複数の組を記憶するコンピュータ読み取り可能な媒体３４２０を含み得る。命令３４２２は更に、コンピュータ・システム３４００によるその実行中、主メモリ３４０６内、及び／又はエンジン３４０２内に完全に、若しくは少なくとも部分的に存在し得る。主メモリ３３０６及びエンジン３４０２は更に、マシン読み取り可能な媒体を構成する。
【００９２】
コンピュータ読み取り可能な媒体３４２０が単一の媒体であるとして例示的な実施形態に示しているが、「コンピュータ読み取り可能な媒体」の語は、命令の１つ又は複数の組を記憶する単一の媒体又は複数の媒体（例えば、中央データベース若しくは分散データベース、並びに／又は関連付けられたキャッシュ及びサーバ）を含むと解されるものとする。「コンピュータ読み取り可能な媒体」の語は更に、マシンによる実行のための命令の組を記憶し、コード化し、若しくは収容することができ、又は、本出願の方法論の何れか１つ又は複数をマシンに行わせ、又は、前述の命令の組によって利用され、若しくは、前述の命令の組に関連付けられるデータ構造を記憶し、コード化し、若しくは収容することができる何れかの媒体を含むよう解されるものとする。「コンピュータ読み取り可能な媒体」はよって、ソリッドステート・メモリ、光媒体、及び磁気媒体に限定されないが、前述の媒体は更に、限定列挙でないが、ハード・ディスク、フロッピー（登録商標）・ディスク、ＮＡＮＤ又はＮＯＲフラッシュ・メモリ、ディジタル・ビデオ・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、リード・オンリ・メモリ（ＲＯＭ）等を含み得る。
【００９３】
本明細書及び特許請求の範囲記載の例示的な実施形態は、コンピュータ上に、ハードウェアに、又はソフトウェア及びハードウェアの組み合わせにインストールされたコンピュータ実行可能な命令（例えば、ソフトウェア）を備える動作環境において実現することが可能である。コンピュータ実行可能な命令は、コンピュータ・プログラミング言語で記述することが可能であり、又は、ファームウェア・ロジックで実施することが可能である。認知された標準に準拠したプログラミング言語で記述された場合、前述の命令は、種々のハードウェア・プラットフォーム上、及び種々のオペレーティング・システムとのインタフェースに対して実行することが可能である。限定列挙でないが、本願の方法を実現するためのコンピュータ・ソフトウェア・プログラムは、例えば、Ｃ、ゴー（Ｇｏ）、パイソン（Ｐｙｔｈｏｎ）若しくは他のコンパイラ、アセンブラ、インタープリタ、又は他のコンピュータの言語若しくはプラットフォームなどの何れかの数の適切なプログラミング言語で記述することが可能である。
【００９４】
このようにして、バースティングされたトライベースの階層データ構造を生成し、管理するコンピュータによって実現される方法及びシステムを説明している。実施形態を特定の例示的な実施形態を参照して説明してきたが、本出願のより広い趣旨及び範囲から逸脱しない限り、種々の修正及び変更を前述の例示的な実施形態に対して行うことが可能である。よって、明細書及び添付図面は、制限的意味合いというよりもむしろ例証的意味合いでとらえられるものとする。
【図１】
0005996088.tif 000002
【図２】
0005996088.tif 000003
【図３】
0005996088.tif 000004
【図４】
0005996088.tif 000005
【図５】
0005996088.tif 000006
【図６】
0005996088.tif 000007
【図７】
0005996088.tif 000008
【図８】
0005996088.tif 000009
【図９】
0005996088.tif 000010
【図１０】
0005996088.tif 000011
【図１１】
0005996088.tif 000012
【図１２】
0005996088.tif 000013
【図１３】
0005996088.tif 000014
【図１４】
0005996088.tif 000015
【図１５】
0005996088.tif 000016
【図１６】
0005996088.tif 000017
【図１７】
0005996088.tif 000018
【図１８】
0005996088.tif 000019
【図１９】
0005996088.tif 000020
【図２０】
0005996088.tif 000021
【図２１】
0005996088.tif 000022
【図２２】
0005996088.tif 000023
【図２３】
0005996088.tif 000024
【図２４】
0005996088.tif 000025
【図２５】
0005996088.tif 000026
【図２６】
0005996088.tif 000027
【図２７】
0005996088.tif 000028
【図２８】
0005996088.tif 000029
【図２９】
0005996088.tif 000030
【図３０】
0005996088.tif 000031
【図３１】
0005996088.tif 000032
【図３２】
0005996088.tif 000033
【図３３】
0005996088.tif 000034
【図３４】
0005996088.tif 000035