(57)【要約】本発明は、低冗長記憶システムでサブブロックを索引するための方法および装置を提供する。各サブブロックはＫビット・キーにハッシュされ、このサブブロックに対するエントリが、ハッシュ・テーブルのツリーから構成されるインデックス・データ構造に追加される。他の態様によれば、ツリーの頂部をアレイにより置換することにより、データ構造は、比較的スムースな成長をしながら、ランダム・キーに対してＯ（１）アクセス時間を達成することができる。【選択図】図３
2008533570.tif 000002
【特許請求の範囲】
【請求項１】
データの１つまたは複数のブロックを索引することにより、データを格納し、通信し、または比較するためにデータを索引する方法であって、
前記ブロックから入手したキーを有するデジタル探索木を備えるインデックスを生成するステップであって、前記ツリーの各葉が、その葉内に入る各キーに対するインデックス値を含むテーブルを有するステップを含む方法。
【請求項２】
前記デジタル探索木が、デジタル二分探索木である、請求項１に記載の方法。
【請求項３】
前記デジタル探索木のディジットが、前記キーの連続しているビットに対応する、請求項２に記載の方法。
【請求項４】
各テーブルがハッシュ・テーブルである、請求項１に記載の方法。
【請求項５】
各ハッシュ・テーブルがバケットを有する、請求項４に記載の方法。
【請求項６】
各インデックス値がブロックの位置を有する、請求項１に記載の方法。
【請求項７】
前記キーがブロックのハッシュである、請求項１に記載の方法。
【請求項８】
前記ブロックのハッシュの一部が、前記テーブルを索引するために使用される、請求項７に記載の方法。
【請求項９】
前記葉と関連するテーブルがアレイ内に格納される、請求項１に記載の方法。
【請求項１０】
前記アレイがメモリ内に位置する、請求項９に記載の方法。
【請求項１１】
前記アレイがディスク上に位置する、請求項９に記載の方法。
【請求項１２】
前記ツリーのサブツリーの頂部Ｌレベルがアレイにより置換される、請求項１に記載の方法。
【請求項１３】
前記ツリーの頂部Ｌレベルがアレイにより置換される、請求項１２に記載の方法。
【請求項１４】
前記ツリーがデジタル二分探索木であり、前記置換アレイが２Ｌ要素を有する、請求項１２に記載の方法。
【請求項１５】
前記置換が、前記サブツリーのＬレベルが所定の基準を満たすときに行われる、請求項１２に記載の方法。
【請求項１６】
前記所定の基準は、前記サブツリーの頂部Ｌレベルが非葉ノードからなることである、請求項１５に記載の方法。
【請求項１７】
前記所定の基準は、前記サブツリーの頂部Ｌレベルが、少なくともＴパーセントの非葉ノードを含み、Ｔが所定のしきい値であることである、請求項１５に記載の方法。
【請求項１８】
前記デジタル探索木が、葉ノードを、取り付けられた複数の新しい葉ノードを有する非葉ノードにより置換することにより拡張され、前記古い葉ノード内のテーブルのコンテンツが前記新しい葉ノードのテーブル間に分布する、請求項１に記載の方法。
【請求項１９】
テーブルの満杯の程度が所定のしきい値を超えた場合に、拡張が行われる、請求項１８に記載の方法。
【請求項２０】
前記テーブルがハッシュ・テーブルである、請求項１８に記載の方法。
【請求項２１】
各ハッシュ・テーブルが満杯分割しきい値を有する、請求項２０に記載の方法。
【請求項２２】
各ハッシュ・テーブルに対する前記しきい値がランダム構成要素を有する、請求項２１に記載の方法。
【請求項２３】
新しい各葉が、サイズが変化するハッシュ・テーブルと一緒に生成される、請求項１８に記載の方法。
【請求項２４】
各ハッシュ・テーブルのサイズが、所定の最小値と所定の最大値の間で選択される、請求項２３に記載の方法。
【請求項２５】
各ハッシュ・テーブルのサイズが、所定の最小値と所定の最大値の間でランダムに選択される、請求項２４に記載の方法。
【請求項２６】
各サイズの前記決定がランダム構成要素を有する、請求項２３に記載の方法。
【請求項２７】
ハッシュ・テーブルが前記ハッシュ・テーブルをメモリ内に読み込み、前記ハッシュ・テーブルを２つのハッシュ・テーブルに分割し、ディスクに前記２つのハッシュ・テーブルを書き込むことにより分割される、請求項１８に記載の方法。
【請求項２８】
前記元の葉のテーブルが使用する記憶空間が、子孫の葉のうちの１つの葉のテーブルに再割り当てされる、請求項１８に記載の方法。
【請求項２９】
前記テーブルがオーバーフロー・チェーンを使用し、最も長いオーバーフロー・チェーンが所定のしきい値に達した場合に、前記テーブルが分割される、請求項１８に記載の方法。
【請求項３０】
前記テーブルがオーバーフロー・チェーンを使用し、所定の長さより長いオーバーフロー・チェーンが横断された場合に、前記テーブルが分割される、請求項１８に記載の方法。
【請求項３１】
前記テーブルが満杯になった場合に、またはキー／値ペアが前記テーブルに追加された場合にいつでも所定の確率Ｐで、前記テーブルが分割される、請求項１８に記載の方法。
【請求項３２】
前記ツリーがメモリ内に保持され、前記葉内のハッシュ・テーブルがディスク上に保持される、請求項１に記載の方法。
【請求項３３】
前記データ構造に対する複雑な攻撃を防止するために、前記キーが最初に秘密鍵によりハッシュされる、請求項１に記載の方法。
【請求項３４】
データの１つまたは複数のブロックを索引することにより、データを格納し、通信し、または比較するためにデータを索引するためのデータ処理装置であって、
前記ブロックから入手したキーを有するデジタル探索木から構成されるインデックスを生成するデータ処理手段であって、前記ツリーの各葉が、その葉内に入る前記キーをその対応するインデックス値にマッピングするテーブルを有するデータ処理手段を備えるデータ処理装置。
【請求項３５】
データの１つまたは複数のブロックを索引することにより、データを格納し、通信し、または比較するためにデータを索引するためにプログラマブル・デバイスに指示するために使用することができるコンピュータ・プログラムを表すデータで符号化したコンピュータ可読メモリであって、前記ブロックから入手したキーを有するデジタル探索木から構成されるインデックスを使用するために、前記コンピュータ可読メモリを作動するための処理手段を使用し、前記ツリーの各葉が、その葉内に入る各キーをその対応するインデックス値にマッピングするテーブルを有するコンピュータ可読メモリ。
【請求項３６】
データの１つまたは複数のブロックを索引することにより、データを格納し、通信し、または比較するためにデータを索引するためのコンピュータ・プログラム・コード手段を備えるコンピュータ・プログラム要素であって、プログラマブル・デバイスに、
前記ブロックから入手したキーを有するデジタル探索木から構成されるインデックスを使用する第１の関数を実行させ、前記ツリーの各葉が、その葉内に入る各キーをその対応するインデックス値にマッピングするテーブルを有するコンピュータ・プログラム要素。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、低冗長コンピュータ記憶システムでデータのサブブロックを索引する方法および装置を提供する。
【背景技術】
【０００２】
低冗長コンピュータ記憶システムにおいては、各ＢＬＯＢ（バイナリ・ラージ・オブジェクト−ゼロ以上のバイト（またはビット）の有限シーケンス）は、サブブロックのプールからのサブブロックのシーケンスとして表示される。図１（従来技術）は、サブブロックのプールおよびプールからのサブブロックのリストとして表示される２つのＢＬＯＢを示す。
【０００３】
格納するデータの各ＢＬＯＢは、サブブロックに分割され、プール内のサブブロックと照合される。プール内にすでに位置する新しいＢＬＯＢ内の各サブブロックは、プール内のサブブロックへの参照により置換される。プール内に存在しない新しいＢＬＯＢ内の各サブブロックは、プールに追加される。新しい固有のサブブロックだけを格納することにより、記憶システムは、格納しているＢＬＯＢの低冗長性表示を形成し、それにより使用する記憶空間の大きさを低減する。図２は、すでにサブブロックＡ、ＢおよびＣ２２を含んでいるプールへのサブブロックＡＢＣＸＹからなる新しいＢＬＯＢ２０の追加を示す。新しいＢＬＯＢ２４は、最初に既存のサブブロックＡ、ＢおよびＣ、および次に新しいＢＬＯＢを追加した結果としてのサブブロック・プールに追加される２つの新しいサブブロックＸおよびＹからなるサブブロックのリストとして表示される。
【０００４】
この方法を実施するために、低冗長記憶システムは、通常、下記の構成要素からなる。すなわち、（ＢＬＯＢを表示し、検索することができるようにする）ＢＬＯＢテーブル３０と、（実際のサブブロック・コンテンツを保持するための）サブブロック・プール３２と、（記憶装置内にサブブロックが存在するか否かを迅速に識別し、存在する場合にはそのサブブロックの位置を発見するための）サブブロック・インデックス３４とからなる（図３）。これら各構成要素は、種々様々な方法で実施することができる。
【０００５】
低冗長記憶システムの速度にとって非常に重要なものはサブブロック・インデックスである。ＢＬＯＢテーブルは、通常、格納している各ＢＬＯＢに対して１回または２回アクセスされるだけであり、効率を良くするために、サブブロック・プールはグループ内のサブブロック上で動作することができるので、サブブロック・インデックスは、格納のためにシステムに提示される各サブブロックに対してアクセスされる（少なくとも簡略化された実施態様の場合）。サブブロックがそれぞれ１キロバイトである場合には、これは２０メガバイトのデータを格納するために、約２０，０００回のインデックス・ルックアップになる。それ故、サブブロック・インデックスが高速であることは非常に重要なことである。
【０００６】
インデックスへのアクセスの実際の速度は、インデックスがメモリ内に保持されているのか、またはディスク上に保持されているのかにより異なる。何故なら、ランダム・メモリ・アクセスは５０ナノ秒程度かかるのに対し、ランダム・ディスク・アクセスは、１０ミリ秒程度かかるからである（約２００，０００倍長い）。インデックスは、ディスク上に完全に保持することもできるし、またはディスク上にその一部を保持することもできるし、またはメモリ内に全体を保持することもできる。インデックスをメモリ内に完全に常駐させることは当然望ましいことであるが、インデックスが大きい場合にはそれは不可能であるか、あまりにコストが高くなりすぎる。インデックスのある部分をディスク上に保持する場合、ディスク・アクセスを最少にするように、特にランダム・アクセス・ディスク・アクセスを最少にするようにインデックスを設計することが重要である。
【０００７】
インデックス・データ構造のもう１つの要件は、スケーリングすることができることであり、スムースにスケーリングすることができることである。何故なら、記憶システムは、多くの場合、予想よりも大きなサイズに成長するからである。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明は、少ない数のランダム・アクセス・ディスク動作で、高速アクセスを行いながら、スムースに成長することができるデータ構造を提供する。
【課題を解決するための手段】
【０００９】
本明細書は、データのブロックの索引を実施するためのデータ構造を開示している。ブロックは、ＢＬＯＢおよびサブブロックを含む。説明のために、本明細書は、サブブロックのインデックスを記述するが、これは本発明を制限するものではない。
【００１０】
サブブロック・インデックスは、サブブロックから入手したキーをサブブロック格納位置にマッピングする。図１８は、マッピング方法を示すと共にそのマッピングを示す。キー１８０は、通常、サブブロック１８４の固定長ハッシュ（例えば、１２８ビットのＭＤ５ハッシュ１８２）である。サブブロック格納位置は、多くの形式をとることができるが、すべてサブブロックの位置を発見するのを助ける。説明のために、ハッシュをキーと呼び、サブブロック位置を値１８６と呼ぶことにする。
【００１１】
データ構造の唯一の目的がキーの有無を記録することである本発明のいくつかの態様の場合には、値は存在しない。これを表示するもう１つの方法の場合、値がすべてゼロバイトの長さを有する。１つの例は、１つのコンピュータが他のコンピュータ内に保持しているサブブロックを追跡している場合であるが、これに限定されない。
【００１２】
本発明のある態様によれば、キー／値マッピングは、その葉がそれぞれ葉内に入るキーをその対応する値にマッピングするハッシュ・テーブルを含んでいる（キーの連続しているビット上の）デジタル二分探索木から構成されるデータ構造を使用して実施される（図４）。非葉ノード５０はエントリを含んでいない。エントリがデータ構造に追加されると、そのハッシュ・テーブルが満杯５４（特定の満杯レベル）になる各葉ノード５２、５４は、２つの葉ノードの子孫５８、５９を含む非葉ノード５６により置換される（図５）。この分割プロセス中、ハッシュ・テーブルのコンテンツは、２つの新しい葉ノード間で分割され、この場合、各エントリは、そのキーの（ツリーにより）次の未使用ビットにより、２つの新しい葉のうちの一方に割り当てられる（図６）。各葉のハッシュ・テーブル・エントリのキーは、ツリー内の葉の位置によりまだ制限されていない元のキーのこれらのビットだけに基づくものでなければならない（図７）。
【００１３】
葉ノード内ハッシュ・テーブルが非常に大きなテーブル（例えば、数千エントリ）に構成されている場合には、データ構造の興味のある特性は、ツリー内の非葉ノードが、葉ノードと比較すると非常に小さなスペースしか占有しないことである。それ故、本発明の他の態様によれば、非葉ノードはメモリ内に保持され、葉ノード（または少なくともこれらが含むハッシュ・テーブル）はディスク上に保持される（図８）。この構成はいくつかの利点を有する。第１の利点は、この構成の場合には、非常に小さなメモリですむことである。第２の利点は、ハッシュの幅（例えば、１２８ビット）がツリーの深さの上部境界となるので、約１２８（１２８ビット・キーに対して）のランダム・アクセス・メモリ・シークのタイトなループの最悪の場合でも、ツリーが非常に高速で横断される（その全体は、依然としてランダム・ディスク・シークより約１５００倍速い）。第３の利点は、葉内のハッシュ・テーブルがそれほど満杯にならない限り、二分木の根−葉横断の終わりのところで発生する葉ハッシュ・テーブルのルックアップは、１回のランダム・アクセス・ディスク・シークからなることである。これは時間がかかるが、ディスク上にツリーの非葉も保持されている場合に必要な数回のランダム・アクセス・ディスク・シークよりは遥かに時間がかからない。
【００１４】
ある実施形態の場合には、キーはサブブロック・ハッシュである。これらのものは（少なくとも理論的には）一様にランダムに分布しているので、その成長の各段階においてツリーがかなりよくバランスすることが多い。これにより、短いツリー横断アクセス時間も短縮することができる。本発明の他の態様によれば、ツリーの頂部Ｌレベルは、２Ｌエントリの１つのアレイにより置換される（図９）。これにより、ツリーの頂部Ｌレベルの横断のＬ回のステップが、アレイをルックアップの１回のステップに低減する。ツリーの成長がバランスよく行われることが多いので、アレイの下のツリーのレベルが少なくなることが多い（図９）。アレイによりツリーのいくつのレベル（Ｌ）を置換するのかの選択は種々の要因により決まり、最も可能性が高い要因は、各レベルのところのツリーの満杯度のレベルである。
【００１５】
ハッシュ値の均一性による均一なツリーの成長により、ツリーの頂部をアレイにより置換することができるが、同じ均一性がツリーの葉の成長中に不連続な部分を生じる。実験により、ツリーは均一に成長することができるので、葉ノードの全底部層が満杯になり、ほぼ同時に分割されることが分かっている。このことは、正確さは低下しないが、リアルタイムの意味を持つ。何故なら、葉ノードを分割するには、その子孫のハッシュ・テーブル間のノードのハッシュ・テーブル内のエントリを分割する必要があり、このことは、テーブルに新しいエントリを単に追加するよりも遥かに長い時間がかかるからである。ツリー内の１つのレベルのところのすべての葉がほぼ同時に分割された場合には、分割が完了し、その正常なレベルを回復するまでシステムの速度は低下する。この性能の低下はいくつかの方法により回避することができる。本発明のさらに他の態様によれば、葉が生成された場合、ランダム満杯しきい値が各葉に割り当てられる。そのハッシュ・テーブルの満杯度がしきい値に達した場合だけ、葉は分割される。例えば、ある葉には４０％のしきい値を割り当てることができ、他の葉には８０％のしきい値を割り当てることができる。ランダム値は、（スペースを無駄にしないように）最小値より小さい値を選択しないで、または（テーブル内での長いオーバラン・チェーンを避けるために）最大値より大きい値を選択しないある分布により選択することができる。ランダムしきい値は、葉が所与のレベルところで分割した場合に時間を拡張する。もう１つのアプローチは、ノードが生成された場合に、各葉ノード内にランダム・サイズのハッシュ・テーブルを生成する方法である。この場合、異なるサイズのハッシュ・テーブルは異なる時間に満杯になる。
【００１６】
要するに、ある方法は、非常に小さなメモリを使い果たすサブブロックを索引するためのものであり、キーをルックアップするために１回のランダム・ディスク・アクセスを必要とし、スケーラブルなものであり、この方法に沿ってほとんどまたは全くリアルタイムの衝撃を与えないでスムースに成長する。
用語
デジタル二分探索木：各レベルのところで行った決定が、キーの連続しているビットにより行われる二分木。
【００１７】
ＢＬＯＢ（バイナリ・ラージ・オブジェクト）：データのゼロ以上のバイト（またはビット）の有限シーケンス。その名前にも関わらず、ＢＬＯＢは必ずしも大きくはない。ＢＬＯＢは、数ビットのように小さいものであってもよいし、またはギガバイトのように大きいものであってもよい。
【００１８】
ブロック：データのゼロ以上のバイト（またはビット）の有限シーケンス。この用語は抽象的なものであり、制限なしにＢＬＯＢおよびサブブロックを含む。
【００１９】
バケット：インデックス・バケット参照。
【００２０】
衝突：衝突は、２つ以上のキーが、ハッシュ・テーブル内の同じスロット（位置）にハッシュした場合にハッシュ・テーブル内で起こる。
【００２１】
衝突チェーン：エントリをハッシュ・テーブルに追加し、エントリが他のエントリと衝突した場合に、元のエントリからのエントリの衝突チェーンを形成することによりそれを格納することができる。衝突チェーンは、テーブル内またはテーブルの外に存在することができる。
【００２２】
デジタル探索木：各レベルのところで行った決定が、キーの連続しているディジットにより行われるツリー。
【００２３】
ディスク：コンピュータが使用するランダム・アクセス記憶媒体。通常、「ディスク」という用語は、磁化したデータを保持している金属の回転円盤（ハードディスク）を意味する。本明細書においては、ディスクという用語は、メモリよりかなり遅いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【００２４】
エントリ：インデックス・エントリ参照。
【００２５】
ハッシュ：ハッシュ・アルゴリズムが生成したバイト（またはビット）の固定長シーケンス。サブブロックのハッシュは、サブブロックを索引し、比較するためのサブブロックを表すものとして使用することができる。
【００２６】
サブブロックのハッシュ：サブブロック・ハッシュ参照。
【００２７】
ハッシュ・テーブル：アレイを使用してキーを値にマッピングする手段。この場合、値（および場合によっては、キーまたはキーの一部）は、キーのハッシュにより決定される位置のところでアレイ内に格納される。
【００２８】
インデックス・バケット：ハッシュ・テーブルを使用してサブブロック・インデックスを実施する実施形態の場合には、ハッシュ・テーブルを、それぞれが空であるかエントリを含み、それぞれが一定数のエントリ・スロットを含むバケットのアレイとして構成することができる。インデックス・バケットの１つの目的は、ハッシュ・テーブルを、ランダム・アクセス・ディスク動作の回数を低減するために、グループとしてディスクから読み出し、ディスクに書き込むことができる部分に構成することである。
インデックス・エントリ：サブブロック・インデックス内のレコード。ある実施形態の場合には、インデックス・レコードは、インデックス・キーおよびインデックス値を含む。ある実施形態の場合には、インデックス・レコードは、インデックス・キーの一部およびインデックス値を含む。ある実施形態の場合には、インデックス・レコードはインデックス値だけを含む。ある実施形態の場合には、インデックス・レコードは値を含まないで、キーの一部または全部を含む。
【００２９】
インデックス・キー：サブブロックについての情報を検索するためにサブブロック・インデックスに提供されるサブブロックについての情報。ある実施形態の場合には、この情報はインデックス・エントリの位置を発見し、読み出すことにより検索される。
【００３０】
インデックス値：サブブロック（またはその一例がそのハッシュであるサブブロックの派生物）をインデックスで参照した場合に、インデックスによりサブブロックについて生成された情報。ある実施形態の場合には、この値は、ディスク上のサブブロックの位置からなる。他の実施形態の場合には、インデックスの唯一の目的がキーの有無を記録することである場合には、値が存在しない場合がある。
【００３１】
キー：インデックス・キー参照。
【００３２】
葉：探索木の葉は、子孫を有していないノードである。
【００３３】
メモリ：通常、ランダム・アクセス・メモリ（ＲＡＭ）を参照するコンピュータが使用するランダム・アクセス記憶媒体。本明細書においては、この用語は、「ディスク」よりかなり速いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【００３４】
分割方法：ＢＬＯＢ内の各バイト（またはビット）が、正確に１つのサブブロック内に入るように、ＢＬＯＢを１つまたは複数のサブブロックに分割するための方法。
【００３５】
低冗長記憶装置：データのその表示の際に、自身が格納している一組のデータ内の複製データのいくつかを除去する記憶システム。
【００３６】
スロット：ハッシュ・テーブル内の位置。スロットは、空であってもよいし、エントリを含むこともできる。
【００３７】
記憶装置：低冗長記憶装置参照。
【００３８】
サブブロック：索引、比較および／または冗長除去のための単位として識別されたバイト（またはビット）のシーケンス。ＢＬＯＢはサブブロックに分割することができる。
【００３９】
サブブロック・ハッシュ：サブブロックへのハッシュ・アルゴリズムの適用結果。サブブロックのハッシュは、例えば、サブブロックを索引および／または比較するために、サブブロックを表すものとして使用することができる。
【００４０】
サブブロック・インデックス：サブブロックの位置（例えば、制限なしで、クラスタ番号（およびまた、おそらくサブブロック識別子））に、サブブロックのハッシュ（またはサブブロック自身）をマッピングする（または他の方法で関連付ける）データ構造。
【００４１】
サブブロック・プール：低冗長記憶システム内のサブブロックの集合体。
【００４２】
横断（Ｔｒａｖｅｒｓａｌ）：ツリー横断参照。
【００４３】
横断（Ｔｒａｖｅｒｓｅ）：ツリー横断参照。
【００４４】
ツリー横断：「ツリーの横断」は、通常、ツリーの各ノードの訪問を意味するが、本明細書の場合には、この用語は、ツリーの根から葉への経路を意味する。
【００４５】
インデックスの値：インデックス値参照。
【００４６】
本明細書全体および添付の特許請求の範囲を通して、別段の指示がない限り、「備える」および「含む」という用語、および「備えている」および「含んでいる」という派生語は、「包含」および「除外しないこと」を意味する用語であると理解されたい。例えば、このような用語を記載の整数または整数のグループを参照するために使用した場合には、このような用語は、任意の他の整数または整数のグループの除外を意味しない。
【００４７】
本明細書の添付の特許請求の範囲は、本明細書に開示する本発明の広義の記述であり、参照により本明細書に組み込むものとする。
【００４８】
本明細書での任意の従来技術への参照は、このような従来技術が共通の一般的知識の一部を形成しているという容認でもなければ、任意の形式の示唆でもないし、またそのように解釈すべきでもない。
【００４９】
添付の図面を参照しながら、以下に本発明の特定の実施形態についてさらに詳細に説明する。これらの実施形態は、説明のためのものであって、本発明の範囲を制限するためのものではない。他の実施形態の示唆および記述を本発明の範囲内に含めることができるが、これらのものは添付の図面には示していないし、または別の方法で本発明の機能を図面には示してあるが本明細書には記述していない。
【００５０】
本明細書で任意の従来技術を参照したからといって、このような従来技術が共通の一般的知識の一部を形成することを承認したものでもなく、または任意の形の示唆でもなく、またそう見なすべきでもない。
【発明を実施するための最良の形態】
【００５１】
図２１は、典型的なコンピュータ・ハードウェア２１０上でのある実施形態の展開方法を示す。すべてのデータ構造はディスク２１２上に常駐している。デジタル二分探索木２１４は、いくつかのＢＬＯＢレコードの作業コピーおよびサブブロック・プールの一部を格納しているいくつかのキャッシュ２１８と一緒にメモリ２１６内に保持される。
６．１  インデックス・キー
サブブロック・インデックス・データ構造は、サブブロックの存在および位置を判定するために使用される。このことは、データ構造のキーは、サブブロックから入手されることを示唆している。
【００５２】
サブブロック自身をキーとして使用することができる。しかしそうすると、ツリーが非常に深くなる場合がある。例えば、すべてのサブブロックが、ゼロである１，０００バイトで開始した場合には、ツリーの各アクセスは、ツリーを下方に向かって何らかの実際の進行（すなわち、あるサブブロックを他のサブブロックから区別する進行）を行う前に、これら１，０００バイトのデータを処理しなければならない。
【００５３】
サブブロックのハッシュは、サブブロック自身より優れたキーになる。何故なら、ハッシュは有限幅（例えば、１２８ビット（１６バイト））を有し、ハッシュは各サブブロック内のすべてのバイトを（損失を起こす方法で）純化するからである。幅が有限なのでキーを操作し易くなり、ツリーはハッシュの幅より深く成長することは決してできない。サブブロックのすべてのバイトをハッシュ・キーにハッシュすれば、サブブロックが長い共通プレフィックスを有する場合に生じる非効率がなくなる。サブブロック・ハッシュをキーとして使用した場合の１つの利点は、結果として得られるキーが可能なキーのスペース内でランダムにまた一様に分布される可能性が非常に高いことである。
６．２  インデックス値
インデックスの各値は、１つまたは複数のサブブロック属性を含むレコードからなる。
【００５４】
低冗長記憶システムにおいては、値は索引中のサブブロックの位置であってもよい。格納位置の値の例としては、ディスク上の位置、ファイル名、ファイル番号、サブブロック・クラスタ番号、少数のサブブロック・クラスタを識別するマスク、およびクラスタ番号とクラスタ内のサブブロック識別子の組合せがあるが、これらに限定されない。
【００５５】
通信用途の場合には、値は、ネットワーク内のサブブロックの位置を運ぶこともできるし、遠隔コンピュータ上のサブブロックの存在を記録するために、インデックス内のサブブロックのキーの存在に単に依存する用途の場合には、情報を全然含んでいなくてもよい。
【００５６】
値の性質は主として索引用途の性質により異なる。
６．３  ツリー
本発明のある態様は、ハッシュ・テーブルのツリーからなる。種々様々なツリーがあり、これらの各役割で使用することができる種々様々なハッシュ・テーブルがある。
【００５７】
キーがサブブロック・ハッシュである場合には、デジタル探索木は特に有効である。何故なら、非常に容易に横断することができるからである。デジタル探索木の場合には、キーは固定幅のディジットに分割され、連続している各ディジットは、ツリーの各レベルのところの分岐を選択するために使用される。例えば、典型的な実施形態の場合には、デジタル二分探索木４０を、１ビット・ディジットに分割したハッシュと一緒に使用することができる。デジタル二分探索木の根４２から開始して、ハッシュの最左端（最上位）のビット４４を、左に行くのか右に行くのかを決定するために使用することができる。根４６の直接の子のところで、次の決定をするために次のビットが使用され、以下同様に行われる（図４）。
【００５８】
ハッシュが２つのビット１０のグループに分割された場合には、このような各グループをディジットとして処理することができ、デジタル探索木は、各非葉ノードからの４つの分岐１２、１４、１６、１８を含む４値デジタル探索木であってもよい（図１０）。同様に、３ビットのディジットは、それぞれ、８つの分岐を有するツリーになる。任意の他の分岐も使用することができる。
【００５９】
任意の小さくないハッシュ・テーブル・サイズの場合、ツリー内の非葉ノードが少ないメモリを使用することは容易に証明できる。デジタル二分探索木およびＫ個のビットのハッシュの場合を考えてみよう。ツリーの各非葉ノードが８バイト（２つの４バイトのポインタ）からなる場合には、（他の葉ノードとの祖先ノードの共有を考慮に入れて）各葉の全メモリ・コストは、８×（１／２＋１／４＋１／８＋．．．＋１／（２Ｌ））となる。ここで、Ｌは葉の深さである。無限Ｌの場合でも、このコストは依然として８バイトにしか過ぎない。各葉内のハッシュ・テーブルがメガバイト以上である場合には、非葉ノードは、全データ構造が使用する全スペースの１００，０００分の１より小さくなる。この高い比率によりメモリ内にツリーを経済的に格納することができる。
【００６０】
特定の葉内に格納しているすべてのキー／値ペア・エントリは、共通プレフィックスを含むキーを有することに留意されたい。それ故、葉内のハッシュ・テーブルにアクセスするためにこの共通プレフィックスの任意の部分を使用しても問題はない（図６、図７）。
【００６１】
ハッシュ・テーブルの使用に関連していくつかの困った問題がある。テーブルのアドレス指定方法、テーブルを格納する場合の衝突の処理方法、およびテーブルの分割方法がそれである。
６．４  ハッシュ・テーブル・アドレス指定
サブブロックがハッシュされ、ハッシュの最初のＴ個のビットがツリーを横断するために使用され、その結果、葉に到着した場合のサブブロックに対する探索中の問題について考えてみよう。葉内にはハッシュ・テーブルが存在する。次に何が起こるか。
【００６２】
最初に、葉に到着するために最初のＴ個のビットを使用しているので、葉のハッシュ・テーブル内に格納している、またはこれから格納するすべてのキーは、同じＴ個のビットのプレフィックスを有する（図６および図７）。それ故、重要なことは、ハッシュ・テーブル内の位置を選択するためにこれらのＴ個のビットを使用しないことである。
【００６３】
ハッシュ・テーブルがＮ＝２Ｐスロット（ここで、Ｐは正の整数である）を含んでいる場合には、キーを容易にハッシュ・テーブルにハッシュすることができる。単に、葉に到着するためにすでに使用したＴ個のビット７０の後のキーのＰ個のビット７２を使用する。Ｎが２のべき乗でない場合には、異なるアプローチを使用することができる。最初のＴ個のビットの後の次のＱ個のビットを使用し、Ｎで割る。残りがハッシュ・テーブル・インデックスである。これにより、（テーブルの他の部分よりテーブルの１つの部分に多くのロードが行われないようにするために）Ｑがｌｏｇ２（Ｎ）より数ビット高い限り、テーブル内でかなり均一な拡張が行われなければならない。種々の他のハッシュ方法も使用することができる。
６．５  ハッシュ・テーブルの衝突
衝突は、２つ以上のキーが、同じ位置（スロット）１１０にハッシュした場合に、ハッシュ・テーブル内で起こる（図１１）（従来技術）。この状況を解決する１つの方法は、第２のエントリを単に廃棄するという方法である。ある場合には、これは正しい選択である。しかし、ハッシュ・テーブルが損失を許容するものでない場合には、このオプションを使用することはできないので、この「オーバーフロー」状況を処理するために種々様々な技術のうちの１つを使用することができる。
【００６４】
衝突を処理するために昔から使用されてきた１つの技術は、オーバーフロー領域１２０と呼ばれる別の記憶領域を有する方法である。各ハッシュ・テーブル・スロット１２２は、オーバーフロー・フィールド１２４を含む。スロット内で衝突が起きた場合には、オーバーフロー・エントリは、オーバーフロー領域内に格納され、エントリへのポインタがスロット１２６内に置かれる（図１２）（従来技術）。オーバーフロー領域によりエントリはまた相互にポイントすることができ、各オーバーフロー・スロットは、エントリのリストをポイントすることができる（図１２）（従来技術）。（ハッシュ・テーブルがメモリ内に位置していて、メモリ・ヒープの形をしている場合のように）別々のオーバーフロー領域を使用できる場合には、この技術はうまく動作する。しかし、ハッシュ・テーブルがディスク上に位置している場合には、オーバーフロー領域内にオーバーフロー・エントリを置くと、通常、少なくとも１回の追加のランダム・アクセス・シークを行うステップが関連する。
【００６５】
衝突に対するもっと完全なアプローチは、ハッシュ・テーブル自身内に衝突しているエントリを格納する方法である。従来のアプローチの場合には、衝突が起こると、第２のハッシュ関数により第２の項目のキーがハッシュされ、結果として得られるスロットがチェックされる。そのスロットが空である場合には、エントリをそこに格納することができる。空でない場合には、第３のハッシュ関数を呼び出すことができ、空のスロットを発見するまで同じ手順を反復することができる。全テーブルが満杯である場合には、ある実施形態の場合には、新しいエントリを追加する前に、テーブルが分割される。一般に、ハッシュ関数Ｈ（Ｋ，Ｘ）は、Ｋがハッシュするキーであり、Ｘが、衝突しているエントリに対するハッシュ・テーブル内の連続している候補の位置を発見するために増大することができる正の整数である場合に定義することができる。キーＫを探索するために、キーを含むスロットを発見するまで、または（テーブル内の特定のハッシュ・オーバーフロー・チェーンの終わりを示す）空のスロットに遭遇するまで、Ｘ＝１，２，．．．に対してスロットＨ（Ｋ，Ｘ）がチェックされる。
【００６６】
しかし、ハッシュ・テーブルが大きくディスク上に位置している場合には、衝突チェーンの後で、ディスク上で一連のランダム・アクセス・シークを行う必要がある。これは非常に時間がかかる。このことは、Ｈ（Ｋ，Ｘ）＝Ｈ（Ｋ，Ｘ−１）＋１と定義することにより、すなわち、（テーブルの終わりのところを囲んでいる）次の隣接スロット１３０（図１３）（従来技術）にオーバーフローすることにより避けることができる。線形プロービングと呼ばれるこの技術の場合には、アクセスは局所的なままである。アクセスした第１のスロットを読み出した場合には、次のＳスロットも小さなＳに対して読み出され、ディスク動作は、（例えば、１２バイトの代わりに１Ｋを読み出すように）余分な時間はかからないし、オーバーフロー・スロットも提供する。新しいエントリが追加されると、複数のスロットを１つのグループとしてディスクに書戻すことができる。衝突チェーンがＳ個のスロットを超えて跨ることがまれになる（およびそれにより追加のディスク・アクセスが必要になる）ように（おそらく動的に）値Ｓが調整される。
６．６  ハッシュ・テーブル・バケット
一度に２つ以上のハッシュ・テーブル・エントリの読出しに関連するアプローチは、テーブルをバケット１４０に分割する方法である（図１４）。例えば、１０２４のスロットのテーブルを、それぞれが１６のスロットを含む６４のバケットのテーブルで置換することができる。エントリを探索するために、バケット内で線形探索を行うことができる（またはおそらく、各バケット内のキーがソートされている場合には、二分探索を行うことができる）。たまにしかバケットは満杯にならないので、その場合には、オーバーフローは次のバケットに移動することができる。テーブルがあまり大きく成長できない限り、オーバーフロー・チェーンはあまり長くすべきではない。インデックス・バケットの利点は、インデックス・バケットは、ランダム・アクセス・ディスク・シークの回数が少なくなるようにディスク・アクセスに対するユニットを生成することである。
６．７  ハッシュ・テーブルの格納
概念上は、ツリーの各葉は、ツリーの種々の部分が格納される位置がどこであれ、ハッシュ・テーブルを「含む」。実際には、メモリ内の葉ノードは、実際のハッシュ・テーブルまたはディスク上のハッシュ・テーブルの位置を含むことができる。ツリーがメモリ８０内に格納され、ハッシュ・テーブルがディスク８２上に格納される典型的な実施形態の場合には、メモリ内の葉ノード８４は、ディスク８２上の葉のハッシュ・テーブル８６の位置へのポインタを格納する（図８）。
【００６７】
すべてのハッシュ・テーブルのサイズが同じである場合には、容易にハッシュ・テーブルを格納することができる。単にファイルまたはディスクの一部を割り当て、ファイル内またはディスク８８の一部内にアレイとしてハッシュ・テーブルを格納しさえすればよい（図８）。アレイ内のハッシュ・テーブルは、任意の順序で格納することができる。
【００６８】
すべてのハッシュ・テーブルのサイズが同じでない他の実施形態の場合には、テーブルをディスク上にヒープ構造を使用して格納することができる。
６．８  ハッシュ・テーブルの分割
葉６２が非葉６４および２つの新しい葉６６、６８に分割される場合には、葉のハッシュ・テーブルのコンテンツは、２つの新しい葉の間で分割される（図６）。
【００６９】
葉ハッシュ・テーブルがすべて同じサイズであり、ディスク１５０のアレイ内に格納される場合には、既存の葉のハッシュ・テーブルは新しい左の葉１５２のハッシュ・テーブル１５４になることができ、１つの余分なハッシュ・テーブル１５６をハッシュ・テーブル・アレイ１５８の終わりに付けることができる。図１５の実施形態の場合には、ハッシュ・テーブルＢをポイントしている葉ノードは分割され、２つの葉ノード子孫を有する新しい非葉ノードになる。ハッシュ・テーブルＢを保持するためのスペースは、新しい左のハッシュ・テーブルＢ１を保持するために使用され、新しいハッシュ・テーブルが新しい右の葉ハッシュ・テーブルＢ２を収容するためにハッシュ・テーブルのアレイの終わりのところに生成される。
【００７０】
最初に考えた場合、元の葉を新しい左の葉として再使用し、新しい右の葉を生成したので、もとの葉の分割は、そのハッシュ・テーブルを通して１回通過し、その次のビットが１である要素を右のハッシュ・テーブルに移動するのと同じくらい簡単なものと思うかもしれない。しかし、このアプローチは、２つの欠点を有する。第１の欠点はオーバーフローである。エントリがテーブルから除去されると、テーブル内のオーバーフロー・チェーンが切れて、いくつかのエントリにアクセスできなくなる恐れがある。第２の欠点は、元の葉に到着するのに使用した頂部Ｔ個のビットの後のＫ個のビットを使用し、エントリがすでにハッシュされていた場合には、これらＫ個のビットの最初のビットはもはや使用すべきではない。何故なら、このビットは新しい葉へツリーの最後のリンクを横断するのに使用するビットであるからである。
【００７１】
これらすべての理由により、ハッシュ・テーブル１９０を分割するための最も簡単な方法は、それをメモリ１９２内に読み込み、メモリ内に２つの新しい新鮮で空のハッシュ・テーブル１９４、１９６を生成し、元のハッシュ・テーブルを１回通過し、各エントリを２つの新しいハッシュ・テーブルの一方または他方に入れるという方法である。次に、２つの新しいテーブル１９８、１９９をディスク１９１に書き込めばよい１９７（図１９）。
【００７２】
どのような方法で分割を行おうとも、エントリ自身が、他のデータ構造、特にディスク上のデータ構造にアクセスしなくても分割を行うことができるだけの十分なそのキーを含んでいれば有利である。
６．９  ツリーの成長
いつ葉を分割すべきか。多数のヒューリスティックを使用することができ、これらはそれぞれ、「満杯」の異なるコンセプトに等しい。
【００７３】
おそらく、最も明白なヒューリスティックは、そのハッシュ・テーブルが完全に満杯になった場合に葉を分割することである。簡単であるが、このヒューリスティックは、テーブルの使用を遅くする恐れがある。何故なら、分割の直前にスロットの平均オーバーフロー・チェーン長さは、テーブル長さの約半分になるからである。
【００７４】
そのハッシュ・テーブルがある割合の満杯度より大きい場合には、葉を分割することができる。例えば、そのハッシュ・テーブルが８０％以上満杯になった場合（すなわち、０．８Ｓエントリ以上（ここで、Ｓはスロット数である）を含んでいる場合）には、葉を分割することができる。
【００７５】
テーブル内の最も長いオーバーフロー・チェーンが、例えば３０のオーバーフローのような所定の長さに達した場合には、葉を分割することができる。所定の長さは許容密度を生じるのに十分高いものに設定しなければならないが、オーバーフロー・チェーンの横断が効率的でなくなるほど長くならないように十分低いものでなければならない。
【００７６】
葉のテーブルにエントリを追加中に、所定のしきい値よりも長いオーバーフロー・チェーンに遭遇した場合には、葉を分割することができる。新しいエントリが追加されるたびに、またはテーブルが満杯になった場合に、所定の確率Ｐで葉を分割することができる。Ｐをあまり低く設定すると、ハッシュ・テーブル内のスペースを過度に浪費する恐れがある。Ｐをあまり高く設定すると、横断するのに非効率的なオーバーフロー・チェーンを生成する恐れがある。
６．１０  ツリーの成長をスムースにする技術
ツリー構造についての経験により、キーがサブブロック・ハッシュである実施形態の場合には、キーは、通常、ツリー内の葉すべてがほぼ同じ時間に分割される傾向があるほど非常に一様に分布していることが分かっている。これにより分割が行われている間、速度が一時的に遅くなる。これらの性能の低下は、各反復の度にますます広くなる性能の低下が拡がるにつれて、２倍の間隔で発生する。しかし、性能の低下は、リアルタイムの性能に悪影響を与える恐れがあるので、それを軽減する手段を調査する価値がある。
【００７７】
（分割する場合の時間を区別する）各レベルが分割する期間を増大する１つの簡単な方法は、各葉が生成される場合に、ランダムなしきい値を各葉に割り当てる方法である。例えば、各葉には、６０〜９０％の間の一様に分布しているランダムな密度しきい値を割り当てることができる。次に、そのハッシュ・テーブルの密度がしきい値を超えた場合に葉が分割される。各葉はそれ自身の密度で分割するので、レベルの分割は、長い時間の間に拡散する。今説明した静的スキームとは別の方法は、しきい値が試験される度にランダムに変化するしきい値に対するものである。
【００７８】
スペースをよりよく活用することができるもう１つのアプローチは、一定の分割しきい値（例えば、８０％）を使用するが、各葉内にサイズの異なるハッシュ・テーブル１６０、１６２、１６４、１６６を生成する方法である（図１６）。このアプローチの場合には、葉は異なる時点で分割される。例えば、ランダム値をＸとＹの間に設定することができる。この場合、Ｘは不必要な分割を起こさせるほど低くはなく、Ｙはリアルタイム処理に分裂を起こさせるほど高くはない。
【００７９】
ある実施形態の場合には、各テーブルに対して小さな一組のサイズ（例えば、１キロバイト、２キロバイト、４キロバイト、８キロバイト）のうちの１つから選択したランダムなサイズを選択すると有利な場合がある。
６．１１  アレイによるツリーの頂部の置換
ハッシュ値のキーは、一様に分布している場合が非常に多いので、ツリーは非常にバランスがとれた方法で成長することが多い。このことは、ツリーの全レベル（例えば、レベル３）９０が非葉ノードで満杯になる可能性があることを意味する。このことが起こった場合、（（例えば）レベルＬへの）ツリーの全頂部を１つのアレイ９２で置換することができ（図９）、Ｏ（Ｌ）からＯ（１）へのツリーのその部分に対するアクセス時間を短くすることができる。
【００８０】
ツリーの頂部を置換する時期を決定するために種々のヒューリスティックを使用することができる。簡単なアプローチは、レベルＬ全体が非葉ノードである場合だけ、ツリーの頂部Ｌレベルを置換する方法である。このアプローチは、簡単であるが、この技術はツリーが成長するにつれて破断する恐れがある。何故なら、下のレベルのいくつかのノードが暫くの間「保持」される恐れがあり、分割されない恐れがあるからである。そのため、頂部Ｌレベルが非葉ノードのＸ％より多くを含んでいる場合に、ツリーの頂部Ｌレベルを置換させるようなヒューリスティックを使用することができる（この場合、Ｘは、予め定義したしきい値（例えば、８０％）である。これは、スペースを浪費するほど低くはないが、最適化を呼び出す厳しい要件になるほど高くはない）。このアプローチを実施する１つの方法は、各ノード内にノードの深さであるフィールド１７０を設置することである。次に、１つの葉ノードへのポインタ１７２を、同じアレイ内の複数のスロット内に置くことができる。葉が満杯になり分割すると、結果として得られる２つの葉へのポインタは、元の葉により占有されているアレイ内の位置を満たすことができる（図１７）。
【００８１】
理論はさておき、ハッシュをキーとして使用し、ツリーの頂部のところにアレイを有し、葉内にハッシュ・テーブルを有するデータ構造に対してＯ（１）の複雑さが達成される。頂部のアレイは明らかにＯ（１）である。葉内のハッシュ・テーブルも明らかにＯ（１）である。これによりアレイと葉の間に非葉ノードの層だけが残り、Ｏ（１）より高い次数の複雑さが増す。ハッシュが一様に分布している場合には、アレイと葉の間のレベルの平均数が、全データ構造がＯ（１）アクセス時間を有することを意味するＯ（１）であることを示す証明を行うことができる可能性があるように思われる。
【００８２】
可能な理論的（およびおそらく実際的）関心事は、葉のハッシュ・テーブル内の現在の各要素を２つの異なる子孫のノードのハッシュ・テーブルのうちの一方に移動するステップを含むハッシュ・テーブル分割動作である。２倍になると、成長しているデータ構造のコストが更新ごとにＯ（１）より高くなる恐れがあるだろうか。答えは「ノー」である。何故なら、個々のエントリを斜めから見た場合、分割動作は２倍の時間間隔で起こるからである。分割される前に満杯になっている長さＮのハッシュ・テーブルに対するエントリごとの全分割コストは、それ故、１／Ｎ＋１／２Ｎ＋１／４Ｎ＋１／８Ｎ．．．であり、Ｏ（１）である１まで加算される。
６．１２  他のデータ構造
ハッシュ・テーブルのツリーを維持する他のアプローチは、ツリーを１つのマスタ・ハッシュ・テーブルで置換する方法である。このアプローチは、そうでない場合は、二分探索木内に格納される各ノードに対するマスタ・テーブル内にハッシュ・エントリを生成することにより実行することができる。
６．１３  複雑な攻撃
攻撃者が、システムのデータ構造のうちの１つを最悪な場合の状態にするように設計されているシステム内にデータを供給する場合に、システム上に複雑な攻撃が発生する。例えば、攻撃者がウェブ・サーバが非平衡二分木を使用していることを知っている場合には、攻撃者は、ツリーをリストにするために、ソートしたデータをツリー内に供給することができる。こうすることにより、サーバが停止するような非常に悪い以降の探索時間が生じる恐れがある。
【００８３】
本発明は、結局（暗号化ハッシュをキーとして使用している実施形態の場合）複雑な攻撃に弱いように見えない。何故なら、ツリーが深くなると、攻撃者にとって特定の葉にハッシュするサブブロックを発見するための計算がますます高価なものになるからである。しかし、そのスケールに到着するまでは、個々の各ハッシュ・テーブルは、攻撃者が同じスロットに反復してヒットするサブブロック内に供給する場合、複雑な攻撃に対して弱い。そのため、そのテーブル内での以降の探索を遅くする恐れがある非常に長いオーバーフロー・チェーンがテーブル内に形成される。
【００８４】
複雑な攻撃を避けるための最も健全な方法は、優れた最悪の場合を有するデータ構造を設計することである。ある種の平衡木構造を使用してこのような設計を行うことができるが、ハッシュ・テーブルを使用してそのような設計を行うのは容易ではない。何故なら、ハッシュ関数がどんなに無秩序であっても、すべてを知っている攻撃者は、ハッシュ・テーブルの最も長いチェーン上に来るような方法で次のキーを形成することができるからである。
【００８５】
（テーブルが最大密度に近づいていない限りは）ランダムに発生するハッシュ・テーブルの最悪（またはほぼ最悪）のケースの確率を無視することができるとするならば、ハッシュ・テーブル内での複雑な攻撃から身を守るための１つの方法は、ハッシュ・テーブルを生成した場合に秘密のランダム・シードを生成し、ハッシュ・テーブル・スロットを形成するためにサブブロック・ハッシュをシードでハッシュする方法である。攻撃者がシードを知らない限り、複雑な攻撃は事実上不可能である。
６．１４  範囲に関する注
当業者であれば、本発明は、上記の特定の用途に限定されないことを理解することができるだろう。また、本発明は、本明細書に記載し図面に示した特定の要素および／または機能に関してその好ましい実施形態に限定されない。本発明の原理から逸脱することなしに、種々の修正を行うことができることを理解することができるだろう。それ故、本発明は、本発明の範囲内に入るすべてのこのような修正を含むものと解釈すべきである。
【図面の簡単な説明】
【００８６】
【図１】その中のいくつかが両方のＢＬＯＢ内に表れる、サブブロックのシーケンスとしてのデータの２つのＢＬＯＢを示す。
【図２】サブブロックＡＢＣＸＹからなる新しいＢＬＯＢの新しい一意のサブブロック（ＸおよびＹ）だけをサブブロック・プール（すでに存在しているサブブロックＡ、ＢおよびＣ）に追加する方法を示す。
【図３】ＢＬＯＢテーブル、サブブロック・プールおよびサブブロック・インデックスを有する低冗長記憶システムを示す。
【図４】その葉がキー／値ペア・エントリを含むハッシュ・テーブルであるデジタル二分探索木（サブブロック・ハッシュの連続しているビット上の）である、サブブロック格納位置にサブブロック・ハッシュをマッピングするために使用するデータ構造を示す。
【図５】そのハッシュ・テーブルが十分満杯になった場合のツリー上の葉ノードの分割方法を示す。
【図６】葉ノードを非葉ノードに変換させ、ハッシュ・テーブル内のそのエントリを２つの新しい子孫の葉ノード間で分割させる二分探索木の葉ノードの分割を示す。新しい葉ノードは、ツリー内で１レベルだけ深いので、これら葉ノード内のエントリへのアクセスは、サブブロック・ハッシュの追加ビットの使用を含む。
【図７】サブブロック・ハッシュであり、残りのものを葉内のハッシュ・テーブルにアクセスするために使用することができる状態で、デジタル二分探索木を横断するためのその左の部分の使用方法を示す。
【図８】メモリ内でのデジタル二分探索木の保持、およびディスク上の葉内、この場合は、ハッシュ・テーブルのアレイを含むファイル内でのハッシュ・テーブルの保持方法を示す。
【図９】デジタル二分探索木の頂部のアレイによる置換方法を示す。
【図１０】ビットの連続しているペアが各レベルで行う選択を決定する４値のデジタル探索木である。
【図１１】（従来技術）２つのキーがテーブル内の同じ位置にハッシュするハッシュ・テーブル衝突を示す。
【図１２】（従来技術）外部オーバーフロー領域を有するハッシュ・テーブルを示す。
【図１３】（従来技術）オーバーフロー・エントリが次の空のスロット（線形プロービング）内に格納されるテーブル内オーバーフローを示す。
【図１４】それぞれが一定数のエントリ・スロットを含むバケットのアレイとして構成されたハッシュ・テーブルを示す。
【図１５】葉ノードを分割する場合の、その既存のハッシュ・テーブルの、左の葉のハッシュ・テーブルとしての使用方法を示す。
【図１６】サイズが変化するハッシュ・テーブルを含む葉を有するデジタル二分探索木を示す。
【図１７】レベル番号により、レベルＬがまだ満杯になっていなくても、アレイでデジタル二分探索木の第１のＬレベルを置換する方法を示す。この図の場合には、第１の２つのレベルが置換される。
【図１８】キーがサブブロックから入手され、値がサブブロックの位置である場合のマッピング方法を示す。
【図１９】ハッシュ・テーブルをディスクからメモリにロードすることによるハッシュ・テーブルの分割、メモリ内でのその分割、その後での２つのハッシュ・テーブルのディスクへの書込みを示す。
【図２０】データ構造上の複雑な攻撃を防止するための秘密鍵によるキーのハッシングを示す。
【図２１】典型的なコンピュータ・ハードウェア上でのある実施形態の展開方法を示す。すべてのデータ構造はディスク上に常駐している。デジタル二分探索木は、いくつかのＢＬＯＢレコードの作業コピーおよびサブブロック・プールの一部を格納しているいくつかのキャッシュと一緒にメモリ内に保持される。
【図１】
2008533570.tif 000003
【図２】
2008533570.tif 000004
【図３】
2008533570.tif 000005
【図４】
2008533570.tif 000006
【図５】
2008533570.tif 000007
【図６】
2008533570.tif 000008
【図７】
2008533570.tif 000009
【図８】
2008533570.tif 000010
【図９】
2008533570.tif 000011
【図１０】
2008533570.tif 000012
【図１１】
2008533570.tif 000013
【図１２】
2008533570.tif 000014
【図１３】
2008533570.tif 000015
【図１４】
2008533570.tif 000016
【図１５】
2008533570.tif 000017
【図１６】
2008533570.tif 000018
【図１７】
2008533570.tif 000019
【図１８】
2008533570.tif 000020
【図１９】
2008533570.tif 000021
【図２０】
2008533570.tif 000022
【図２１】
2008533570.tif 000023
【国際調査報告】
2008533570.tif 000024
2008533570.tif 000025