(57)【要約】【課題】選択されたユニコード符号点のような大きい範囲の値の不連続部分集合を、完全ハッシュを用いて、連続またはほぼ連続したより小さい範囲に変換する方法および機構を提供すること。【解決手段】大きい範囲をページとそのページ内へのオフセットの二次元ビットマップ行列（３８）に編成する。値が部分集合に含まれるならば、行列内のビットは１になり、含まれなければ０になる。次に、各ページを他のページの値との衝突を避けるために必要に応じてシフトすることによって、ページを次々に一次元ビットマップ（４０）にオーバレイする。シフト量を記録し、ハッシュ計算に使用する。ここで、大きい範囲の値を最初にページ番号とそのページ内へのオフセットに分離する。次に、そのページのシフト量を探索し、シフト量をページ内へのオフセットに加算することによって、大きい範囲の値を密な部分集合範囲の値にハッシュ化する。【選択図】図１
2011003214.tif 000002
【特許請求の範囲】
【請求項１】
ある範囲の値を含むデータを格納するメモリを備え、該データを処理するコンピュータシステムにより実行される方法であって、前記ある範囲の値のうちの不連続な値から構成される不連続な値の部分集合を完全なハッシュを用いて連続した、またはほとんど連続したより小さい範囲で変換しハッシュ値を得る方法において、
前記ある範囲の値の中から前記値の部分集合に含まれる値を選択するステップと、
前記ある範囲の値により構成される集合の値を二次元行列に編成するステップであって、前記行列の１つの次元がページを表し、他の次元が前記ページ内へのオフセットを表し、前記行列のページと該ページ内へのオフセットとの各交叉位置に、その交叉によって表される値が前記値の部分集合に選択された値であるか否かを示す写像情報を含むようにするステップと、
各ページを選択し、各ページの写像情報を検査して一次元配列内の写像情報との衝突が無いかを調べ、衝突が検知されなくなるまで各ページを、前記オフセットをずらすことによってある量だけシフトし、前記ページの写像情報を一次元配列のシフト後の位置に重ねあわせ、シフト量を記録することによって、前記行列を一次元配列に変換し、前記ページごとのページオフセット表および索引付けされた値を格納するハッシュ表を前記メモリに格納するステップと
を具え、
前記値を、その都度行と列に分割する方法を変えながら、別の行列を構成し、特定のループ反復により、以前の最良の分割がさらに改善される場合、そのページオフセット表および付随する統計を前記以前の最良の分割と置換し、それによって全ての可能な分割の組み合わせを試みた後、最少量の空間を使用する分割を最終的に残して該分割により得られたページオフセット表及びハッシュ表を前記メモリに格納し、
アプリケーションプログラムにより入力値として前記ある範囲の部分集合に含まれる値が受け取られると、前記入力値は前記メモリに格納されたページオフセット表のエントリ数で分割され、当該分割された下位ビットを前記ページオフセット表内のページとして、対応するオフセット値を求めることにより、前記メモリに格納されたハッシュ表から、前記入力値に対応するハッシュ値を得ることを特徴とする方法。
【請求項２】
ある範囲の値を含むデータを格納するメモリを備え、該データを処理するコンピュータシステムであって、前記ある範囲の値のうちの不連続な値から構成される不連続な値の部分集合を完全なハッシュを用いて連続した、またはほとんど連続したより小さい範囲で変換しハッシュ値を得るコンピュータシステムにおいて、
前記ある範囲の値の中から前記値の部分集合に含まれる値を選択する手段と、
前記ある範囲の値により構成される集合の値を二次元行列に編成する手段であって、前記行列の１つの次元がページを表し、他の次元が前記ページ内へのオフセットを表し、前記行列のページと該ページ内へのオフセットとの各交叉位置に、その交叉によって表される値が前記部分集合に選択された値であるか否かを示す写像情報を含むようにする手段と、
各ページを選択することによって前記行列を一次元配列に変換する手段であって、該手段が各ページの写像情報を検査して一次元配列内の写像情報との衝突が無いかを調べる手段と、衝突が検知されなくなるまで各ページを前記オフセットをずらすことによってある量だけシフトする手段と、前記ページの写像情報を一次元配列のシフト後の位置に重ねあわせる手段と、シフト量を記録する手段とから構成される行列を一次元配列に変換し、前記ページごとのページオフセット表および索引付けされた値を格納するハッシュ表を前記メモリに格納する手段と
を具え、前記値を、その都度行と列に分割する方法を変えながら、別の行列を構成し、特定のループ反復により、以前の最良の分割がさらに改善される場合、そのページオフセット表および付随する統計を前記以前の最良の分割と置換し、それによって全ての可能な分割の組み合わせを試みた後、最少量の空間を使用する分割を最終的に残して該分割により得られたページオフセット表及びハッシュ表を前記メモリに格納し、
アプリケーションプログラムにより入力値として前記ある範囲の部分集合に含まれる値が受け取られると、前記入力値は前記メモリに格納されたページオフセット表のエントリ数で分割され、当該分割された下位ビットを前記ページオフセット表内のページとして、対応するオフセット値を求めることにより、前記メモリに格納されたハッシュ表から、前記入力値に対応するハッシュ値を得ることを特徴とするコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般的にコンピュータシステムの記憶装置に関し、さらに詳しくは、表に対応づけられるデータを格納するための改良された方法およびシステムに関する。
【背景技術】
【０００２】
大きさ６４キロバイトで１６ビットのキーにより索引付けされる表のようなエントリの大きい表は、特定の用途によってサポートされる不連続エントリの比較的小さい部分集合を含むことができる。例えば、ユニコードは、１６ビットの符号化単位を基礎にする世界的な文字符号化標準である。特定の言語で使用される符号点しかサポートしないユニコード構成製品では、その言語の符号点のより小さい不連続部分集合が使用される。例を挙げると、日本語の場合、製品は、通常日本工業規格（ＪＩＳ）コードを使用しており、ユニコードによってサポートされる６４キロバイトの可能な記号のうち、約６，０００個の記号しか使用されない。この６０００個ほどの記号は、ユニコードの範囲全体の様々な位置に広く分散され、残りの符号点は、その製品にとって無意味である。
【０００３】
より少数の文字属性または類似物をフルサイズ６４キロバイトの表に格納すると、多くの未使用のエントリ値が残る。この格納方法は、ユニコード値をキーとして使用して簡単な索引付け作業を可能にし、したがって、格納された情報を検索する最高速の方法であるが、表は、属性のサイズの６４０００倍であり、空間の多くが無駄になる。多くのシステムや用途では、高速検索速度は、この方法を実現するために要求されるメモリの量に値せず、したがって他の格納方法が試みられてきた。
【０００４】
フルサイズのエントリ表に代わるものとして、二分探索を使用する方法がある。そのような二分表ではスロットの無駄が無いが、各エントリと共にキーを格納しなければならず、関心対象のエントリを格納するために使用する空間の量は増大する。さらに、表の大きさをＮとした場合、探索を実行するためにＯ（ｌｏｇ（Ｎ））の演算を行い、したがって平均すると、他の格納方法に比べて比較的遅い検索になる。
【０００５】
ハッシュ表を使用して、符号点から計算したハッシュ値によって索引付けされる属性を格納することもできる。ハッシュ表の１つの型として、衝突解消付きのハッシュ表がある。この型のハッシュ表は、通常各エントリと共にキーを格納することによって達成される、衝突を処理するための情報を格納しなければならない。衝突の有無を試験するために余分な時間を必要とし、また衝突が検知されたときに衝突を解消するためにさらに多くの時間を必要とする。最後に、この型のハッシュ表は、一般的にしばしば、多数の余分な未使用のエントリで終わってしまう。つまり、表は必ずしも密にパックされるとは限らない。
【０００６】
最後に、完全ハッシュアルゴリズム（衝突が無い）は、メモリの使用と速度の間の優れた調和をもたらすことができるので、多くの用途で望ましい性能を達成する。さらに、完全ハッシュアルゴリズムでは、エントリと共にキーを格納しないので空間が節約される。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、完全ハッシングでは、一般的に余分な未使用のエントリが存在するので空間が無駄になる。また、検索時間は各探索作業における重要な要素であるので、ハッシュ値を計算するために必要な費用（例えば処理時間の量）にも重要な考慮を払わなければならない。さらに、比較的大きい範囲の値の１つの部分集合のハッシングにうまく働いたものが、別の部分集合ではうまく働かない。したがって、完全ハッシュアルゴリズムの大きな問題は、一般的に、共に非常に高速である値の任意の部分集合の完全ハッシュを見つけ、およびハッシュ値を一緒に密にパックするための優れた迅速な首尾一貫した方法が存在しないことである。
【課題を解決するための手段】
【０００８】
したがって、本発明の一般的目的は、大きい範囲の不連続値の任意の部分集合に関する完全ハッシュを生成する方法および機構（装置）を提供することにある。
【０００９】
さらに別の目的は、ハッシュ値を密にパックする、上述の特徴を持つ方法および機構を提供することにある。
【００１０】
別の目的は、ハッシュ値の非常に高速な計算を実行できる上述の種類の方法および機構を提供することにある。
【００１１】
関連目的は、自動的に作動する方法および機構を提供することにある。
【００１２】
これらの目的を達成する上での別の関連目的は、不連続ユニコード符号点の部分集合でうまく機能する、上述の特徴を持つ方法および機構を提供することにある。
【００１３】
さらに別の目的は、高速であり、信頼でき、費用効果が高く、柔軟性があり、様々な用途に拡張可能な上述の方法および機構を提供することにある。
【００１４】
簡単に言うと、本発明は、大きい範囲の値の不連続部分集合を、完全ハッシュによる連続したまたは大部分が連続したより小さい範囲に変換するための方法および機構を提供するものである。値の部分集合は、範囲内の値の中から選択され、範囲は二次元行列に編成される。行列の１つの次元は、ページを表し、別の次元はページ内へのオフセットを表す。行列は、ページとページ内へのオフセットとの各交叉位置に、その交叉位置によって表される値が部分集合の選択値であるか否かを示すビットなどの写像情報を含む。例えば、部分集合に選択される場合、ビットは１であり、選択されない場合は零である。
【００１５】
次に、各ページを選択し、各ページの写像情報（例えば１のビット）に一次元配列内の写像情報との衝突が無いかを検査し、衝突が検知されなくなるまで各ページをある量づつ移動（シフト）することによって、行列は一次元配列（例えばビットマップ）に変換される。衝突が検知されなければ、ページ写像情報がシフト位置における一次元配列にオーバレイされ、シフト量がページオフセット表に記録される。
【００１６】
不連続範囲の値を受け取ると、その値は、ページ番号とそのページ内へのオフセットとに分割される。値はそれにより、そのページのシフト量を探索し、そのページ内へのオフセットにシフト量を加算することによって、サブセット範囲の値にハッシュ化される。
【００１７】
他の目的および利点は、図面に関連して取り上げる以下の詳細な説明から明らかになるであろう。
【図面の簡単な説明】
【００１８】
【図１】本発明に従って完全ハッシュを生成するためのコンピュータシステムを表すブロック図である。
【図２】可能なエントリの表の典型例を表すブロック図である。
【図３】図２の表の選択されたエントリを示す代替的方法を表すブロック図である。
【図４】図２の表の選択されたエントリを示す代替的方法を表すブロック図である。
【図５】選択されたエントリに関する情報を格納するためのビットマップ行列を表すブロック図である。
【図６】選択されたエントリに関する情報を格納するためのビットマップ行列を表すブロック図である。
【図７】本発明の一態様に従ってビットマップ行列から一次元合成ビットマップへページをオーバレイする過程を順次に示すブロック図である。
【図８】本発明の一態様に従ってビットマップ行列から一次元合成ビットマップへページをオーバレイする過程を順次に示すブロック図である。
【図９】本発明の一態様に従ってビットマップ行列から一次元合成ビットマップへページをオーバレイする過程を順次に示すブロック図である。
【図１０】本発明の一態様に従ってビットマップ行列から一次元合成ビットマップへページをオーバレイする過程を順次に示すブロック図である。
【図１１】本発明の一態様に従ってビットマップ行列のページが相互にオーバレイされるときのページオフセット表におけるオフセット値を示す図である。
【図１２】本発明の一態様に従ってビットマップ行列のページが相互にオーバレイされるときのページオフセット表におけるオフセット値を示す図である。
【図１３】本発明の一態様に従ってビットマップ行列のページが相互にオーバレイされるときのページオフセット表におけるオフセット値を示す図である。
【図１４】本発明の一態様に従ってビットマップ行列のページが相互にオーバレイされるときのページオフセット表におけるオフセット値を示す図である。
【図１５】エントリ情報が充填されていくハッシュ表を表す図である。
【図１６】エントリ情報が充填されていくハッシュ表を表す図である。
【図１７】エントリ情報が充填されていくハッシュ表を表す図である。
【図１８】エントリ情報が充填されていくハッシュ表を表す図である。
【図１９】本発明に従って完全ハッシュを生成するための過程を一般的に表す流れ図である。
【図２０】本発明に従って完全ハッシュを生成するためにビットマップ行列のページをオーバレイするための過程を一般的に表す流れ図である。
【図２１】本発明の一態様に従ってキーからハッシュ値を計算するためのコンピュータシステムを表すブロック図である。
【発明を実施するための形態】
【００１９】
（実施形態の説明）
図面を参照しながら説明する。まず図１において、本発明に従ってオフセット表を使用して不連続値を再写像するためのコンピュータシステムが、全体的に符号２０で表されている。コンピュータシステム２０は、記憶装置２４に効果的に接続されたプロセッサ２２を含み、該記憶装置はランダムアクセスメモリ（ＲＡＭ）と、ハードディスクドライブ、光ドライブまたは類似物などの不揮発性記憶装置とを含む。ご理解いただけるとおり、不揮発性記憶装置２８は、よく知られたスワップ技術を介して、ＲＡＭと一緒に使用して比較的大量の仮想メモリを形成することができる。明らかになるであろうが、本発明では、読取り専用メモリ（ＲＯＭ）または同様の不揮発性システムを使用することができる。また、埋込みシステムは本発明から利益を得ることができる。
【００２０】
コンピュータシステム２０はまた、ユーザコマンドをプロセッサ２２に伝えるために、入出力回路機構（Ｉ／Ｏ）３２を介して接続された少なくとも１つの入力装置３０、通常はキーボードおよび／またはマウスなどのユーザポインティング装置を含む。同様に、コンピュータディスプレイモニタおよびスピーカなど、少なくとも１つの局所出力装置３４が、グラフィカルユーザインタフェースなどを介して、プロセッサ２２からシステム２０のユーザへ情報を伝えるために、Ｉ／Ｏ３２に接続される。
【００２１】
本発明の一態様では、値の大きい範囲内の不連続な位置にある値の部分集合が与えられると、再写像プロセス３６がこの部分集合を、連続した、またはほぼ連続した、零を基底とする範囲に変換する。例えば、大きい値の範囲は、文字属性の大きい表３８に索引を付けるための００００ｈ（１６進数）から０ｆｆｆｆｈまでの範囲の索引に対応するかもしれない。例えば索引は、ユニコード符号点である。容易に理解できるように、表３８にかなりの量の空間を割り当てる必要がある。しかし、特定の用途にとっては、表３８のエントリのうち、特定のものだけが関心の対象である。例えば、用途またはオペレーティングシステムによってサポートされる文字に対応する符号点だけが、その用途またはオペレーティングシステムにとって重要である。典型的な用途では、再写像プロセス３６は、基本的に、関心のあるエントリを取り出し、それらを、元の表のキーを受け取り、ほとんど密なハッシュ表４０に対するハッシュ値索引に変換することができる方法で、ほとんど密なハッシュ表４０に再パックする。再写像プロセスの一部としてオフセットの表４２が生成され、これを、以下で述べるように、元の索引値と一緒に使用して、ほとんど密なハッシュ表４０のハッシュ値が計算される。
【００２２】
したがって、本発明には区別される２つの態様があることに注意する必要がある。第一態様は、大きい表３８のキーなどの不連続値の部分集合をオフセット表４２へ変換することを含む。本発明の第二態様は、その後にオペレーティングシステム、ドライバ、アプリケーションプログラムまたは類似物がオフセット表４２を使用して、大きい表３８のキーをハッシュ値、例えばほとんど密なハッシュ表４０に対するハッシュ値索引にハッシュ化することを含む。典型的な使用法では、ほとんど密なハッシュ表４０は、ユニコード文字属性または類似物の表を提供するために、コンピュータを使用する事実上どのような種類の装置にでもロードすることができる。大きいユニコード表３８における位置に対応するユニコード符号点を受け取ると、ハッシュ表４０のハッシュ値が計算され、そこから属性が見つけ出される。
【００２３】
本発明の動作の説明に移ると、本発明は、６５５３６のユニコード符号点の範囲内における日本語の文字の部分集合にかなりの利益をもたらす。それにもかかわらず、本発明は、ユニコード符号点の部分集合に限定されず、明らかになるとおり、いつでも大きい範囲のより小さい不連続部分集合を取り扱うときに、多くの潜在的用途がある。
【００２４】
簡素な例として、図２に１６個のエントリの表３８を示す。そのうち特定のエントリだけが、ほとんど密なハッシュ表４０に再写像される。さらに詳しくは、００００ｂ、０００１ｂ、００１０ｂ、０１１０ｂ、１０００ｂ、および１１１１ｂによって索引付けされたエントリが、アプリケーションプログラムの関心対象である。例えば、図３に概念的に示すように、（多少異なる配列法で）、００００ｂは、図形的に文字「Ａ」を表示するための属性を索引付けし、０００１ｂは文字「Ｂ」を索引付けし、以下１１１１ｂが「Ｐ」を表すまで繰り返される。
【００２５】
これらのうち、Ａ、Ｂ、Ｃ、Ｇ、Ｉ、およびＰだけがサポートされる。容易に理解いただけるとおり、これは一般に、可能なユニコード文字の６５５３６個のエントリの表から文字（例えば日本語の文字）の不連続集合を選択することに対応する。
【００２６】
変換を実行するために、ステップ８００〜８０４で、大きい表３８の索引が選択され、行（ページ）と列のビットマップ行列に展開される。図５は、１６個のエントリの表に対する４行×４列の行列４４を示す。図３において、対応して関心のあるエントリの索引は、ビットマップにおいて対応するビットが１にセットされ、図５のビットマップ行列４４では「Ｘ」で示される。（見易さのため、および索引の１および０との混同を避けるため）一方、他のビットは全て０（すなわち空白）である。６４ｋのユニコード索引のように１６ビットで索引付けされる表の場合、初期行列は、例えば２５６行（８ビット）および２５６列（８ビット）で構成することができる。したがって、行０は、００００ｈから００ＦＦｈの間の任意の所望のユニコード文字に対するビットが１にセットされ、行１は、０１００から０１ｆｆｈまでの範囲の所望の文字に対するビットが１にセットされ、等々と繰り返される。
【００２７】
表３８の索引が図５のビットマップ行列４４に展開される本実施例の説明を続けると、各行は、００ｂから１１ｂまでの番号が付けられたページと考えることができ、それによって列番号は、００ｂから１１ｂのページ内へのオフセットとなる。あるいは、列をページとして使用し、行番号がページ内へのオフセットを表すこともできる。実際、６４キロバイトの可能なユニコード文字の集合の部分集合を取り扱う場合、列をページとし、行をオフセットとして使用すると、大抵の場合、さらにいっそう密なパッキングが得られることが明らかになっている。
【００２８】
しかし、以下で説明するとおり、両方の方法を試し、最良の結果（ほとんど密なパッキング）を選択することができる。
【００２９】
本実施例では、図６に最もよく示すとおり、図５の元の４×４の行列４４は、新しい行列４５に概念的に再構成され、図５の列はページになり、（図６では水平方向に示す）、行はページ内へのオフセットになる（図６では垂直方向に示す）。
【００３０】
本発明の一態様に従って、ページは一度に１枚づつ、次々に上に重ねられ(オーバレイ)、密な、またはほとんど密な一次元合成ビットマップ４６になる。選択された索引（ビットマップで１のビットで表される）は不連続であり、一般的に幅広く分散しているので、幾つかのページのビットが衝突することなく、または少なくともほとんど衝突せずにインタレースする傾向がある。索引を表すビットが別のビットと衝突するときはいつでも、合成ビットマップ４６にオーバレイされる現在のページが、一文字分だけ右にシフトする。ページが衝突無く完全にインタレースする場合、シフト量が、ページオフセット表４２にそのページのオフセットとして記録される。
【００３１】
ページが次々にオーバレイされる順序は、ページがいかによくインタレースするか、したがってどれだけのシフトが必要になるかに影響し、これが最終的にハッシュ表４０の大きさを決定することに注意する必要がある。したがって、最良のパッキングを見つけ出す１つの方法は、ページ順序付けの全ての組合せを試して、最良の結果を選択することであろう。理解いただけるように、これは極めて高価になる（例えば、２５６行および２５６列に分割された１６ビットの索引では、２５６の階乗の組合せが可能である）。
【００３２】
ページをオーバレイする適正な順序を得るためのより安価な方法は、より多くの１ビットをそのうえに含むページが、１ビットの数がより少ないページより前に合成ビットマップ４６にオーバレイされるように、ページを順位付けすることである（つまり、最多から最少への順位付け）。この目的のために、順位付けプロセスがステップ８０６で呼び出され、様々なページにおける１ビットの数を計数し、その計数に従ってページを順位付けする。そうした１ビット加重順位付けプロセスは、極めて密なパッキングを達成することが明らかになっている。実際、他の最適化（以下で説明する）をこの順位付けプロセスと結合したときに、１００％の（または１００％に非常に近い）パッキングが高速で達成される。
【００３３】
しかし、一般的な順位付け技術にもかかわらず、ハッシュ表を開始する最初のページが、そこの文字数に関係なく、ビットマップ行列４５の最初のページとなるように選択することが好ましい。本発明に必要というわけではないが、明らかになるとおり、所望の索引として零を選択し、零としてこのページから始めることにより、大きい表３８の零索引が常に零に写像されることが確実になり、これは空白で終了する文字列および類似物を取り扱うときに有用である。
【００３４】
図７は、図２０の流れ図に対応し、Ｐａｇｅ00は零索引を含むので、ステップ９００で図６の第１ページＰａｇｅ00から始まるオーバレイプロセスを示す。図７に示すように、合成一次元ビットマップ４６aは、単にこのページになるだけであり、このページのシフトは行われないので、ステップ９１０で零のオフセットがページオフセット表４２に書き込まれる。第１ページの場合、この時点で衝突はなく、零が選択されることを前提として、第１ページに先行する零はないので、ステップ９００から直接ステップ９０８に続くことに注意されたい。このプロセスが最終的に終了したときに、この特定のビットスプリットが選択された場台、ｐａｇｅ00の各１ビットに対応する表データが、ハッシュ表４０に書き込まれる（ステップ８１４のように）ことに注意されたい。例えば、図１５に示すように、零によって索引付けられた位置に「Ａ」属性データが書き込まれ、２によって索引付けられた位置に「Ｉ」が書き込まれる。ステップ９１４は、別のページを検査し、１が得られるので、ステップ９００に戻り、そこで次のページｐａｇｅ10が選択される。
【００３５】
図８は、次のページｐａｇｅ10の前の合成ビットマップ４６aへのオーバレイを表し、これにより新しい合成ビットマップ４６bが生成される。ｐａｇｅ10が次にオーバレイされるのは、ステップ８０６の順位付けプロセスで、この行が残りの行に比べて、１にセットされたビットが最も多い（２個）ことが決定されたためであることに注意されたい。
【００３６】
ｐａｇｅ10をオーバレイするために、ステップ９０２でｐａｇｅ10は、最初に、先行する零ビットの数に等しい量だけ左にシフトされる。この位置で、衝突の検査がステップ９０４で実行される。１つのそうした衝突の検査は、現行ページ(ｐａｇｅ10)のビットと前の合成ビットマップ４６aのＡＮＤ（論理積）を取り、結果が零かどうかを検査することによって達成される。零になれば、衝突は無い。零でなければ、衝突が検知され、それによりステップ９０６でページは、１ビット右にシフトされ、衝突検査が繰り返される。衝突が検知されなくなるまで、必要なだけシフト操作が続く。
【００３７】
本実施例では、ステップ９０４〜９０６の衝突検知および解消プロセスにより、ｐａｇｅ10は、このページが前のビットマップ４６aに結合される前に、零の右に３位置分シフトする（図８に最もよく表す）。このページの３のオフセットが、図１２に最もよく示すように、ページオフセット表４２に記録される。しばらく後で（ステップ８１４で行われるように）、このビット分割（スプリット）が選択されたと仮定して、配列データ、例えば「Ｃ」および「Ｇ」の属性は、図１６に示すようにハッシュ表４０の適切な位置に追加されることに注意されたい。図８に示すように、合成ビットマップ４６bは、今５ビットの長さであり、ハッシュ表４０は、少なくとも五個のエントリに割り当てられる空間を持たなければならないことに注意されたい。したがって、合成ビットマップ４６は、ハッシュ表４０と同様に、シフトされたビットを収容するために必要なだけ成長するが、１だけが関心のあるエントリを表す（索引付ける）ので、後続零ビット（空白）は、合成ビットマップ４６の一部と考慮されない。ハッシュ表４０の最終的大きさを決定する合成ビットマップ４６が成長する量は、値の部分集合のパッキングがどの程度密であるかによって異なる。
【００３８】
合成ビットマップ４６にオーバレイされる次のページ（ステップ９１４および９００）は、ｐａｇｅ11である。ｐａｇｅ11およびｐａｇｅ01は各々１ビットがそこにセットされているが、この実施例では、ステップ８０６の順位付けプロセスで、ｐａｇｅ11がｐａｇｅ01より前に配置されるように順位付けられたと仮定していることに注意されたい。図６の行列４５および図９に示すように、ｐａｇｅ11には３個の先行する零ビット（空白）がある。したがって、オーバレイプロセスを試みる前に、ステップ９０２で、ｐａｇｅ11は、衝突を検査する前に、最初に３回左にシフトされる。明らかなとおり、ステップ９０４で、この（マイナス３の）オフセットに衝突が存在することが決定され、したがってステップ９０６でページは１つ右にシフトされ（オフセットが増分される）、衝突試験が繰り返される。今度はステップ９０４で、衝突が無いと決定され、したがってステップ９０８でｐａｇｅ11はマイナス２のオフセットで前の合成ビットマップ４６bに結合され、新しい合成ビットマップ４６c（図９）になる。ステップ９１０で、このページのマイナス２のオフセットが、図１３に最もよく示すように、ページオフセット表４２の適切な位置（位置３）に記録される。後で、ステップ８１４で行われるように、この索引に対応するデータ、例えば「Ｐ」の属性が図１７に示すように、ハッシュ表４０における合成ビットマップ４６cの索引位置に対応する位置に格納されることに注意されたい。
【００３９】
合成ビットマップ４６にオーバレイされる最後に残った１枚のページは、ｐａｇｅ01である。図６の行列４５および図１０に示すように、ｐａｇｅ01には先行する零ビット（空白）が無い。したがって、ｐａｇｅ01は、衝突検査の前に、ステップ９０２で左にシフトされない。明らかなように、ステップ９０４で零オフセットに衝突が存在し、したがってこのｐａｇｅは、ステップ９０６で１つ右にシフトし、オフセットが増加され、ステップ９０４の衝突検査が繰り返される。
【００４０】
容易に理解できるように、ステップ９０４で衝突が検出され続け、ｐａｇｅ01がプラス５の位置分オフセットされるまで、ページはステップ９０６でシフトされる。その結果、ｐａｇｅ01は、プラス５のオフセットで前の合成ビットマップ４６cに結合され、新しい最終合成ビットマップ４６が形成される（図１０）。ｐａｇｅ01前の合成ビットマップの大きさ全体分シフトしたことに注意されたい。
【００４１】
さらに詳しくは、前のビットマップ４６cが１００％パッキングされていたので、ｐａｇｅ01は、前の合成ビットマップの終わりの位置からオーバレイされた。
【００４２】
１００％パッキングを検査し、検知された場合には、ビットマップの先頭から始めて終わりまで繰り返しシフトするのではなく、すぐに最後に次のページをオーバレイすることが可能であることに注意されたい。
【００４３】
ステップ９１０で、このページの５のオフセットが、図１４に最もよく示すように、ページオフセット表４２に記録される。プロセスは次に図１９に戻る。再び、少し後のステップ８１４で、この索引に対応する属性データ、例えば「Ｂ」の属性が、図１８に示すように、合成ビットマップ４６の索引位置に対応する位置ハッシュ表４０に格納されることに注意されたい。
【００４４】
この時点で、初期の１６個のエントリの表３８の６個の分散索引および対応するデータを、４個のエントリ（例えばバイト）のページオフセット表４２と共に、０から５までの範囲の値によって索引付けされた密にパックされたハッシュ表４０に再写像することができる。このような小さい例でも、メモリの節約が顕著になることに注目されたい。例えば、初期の１６個のエントリの表３８に各索引ごとに１キロバイトが割り当てられた場合、この表は１６キロバイトのメモリを必要とする。しかし、同じデータを６キロバイトのハッシュ表＋ページオフセット表のための４個の格納単位（例えば語またはバイト）に保存することができる。実際、以下で説明するように、初期の大きい表３８に対するキーを密なハッシュ表４０のハッシュ値索引に変換するために必要なものは、ページオフセット表４２だけである。さらに大きい配列の大きい部分集合でも同様の節約が達成され、自動再写像プロセスから特に利益を得られる。
【００４５】
本発明に必要というわけではないが、最適に高密なパッキングを見つけ出すために，行と列に同じ番号を持たないものを含めて、様々なビットマップ行列を試すことができる。例えば、１６ビットの索引の場合、８ビット×８ビット以外の分割を使用して、上述のような方法で値を再写像することができる。最適分割の発見を達成するために、ステップ８０８では、合成ハッシュ表４０の大きさおよびページオフセット表４２を、ハッシュ表４０に対応する統計として保存する。
【００４６】
次に、プロセスはステップ８０２にループバックし、その都度値を行と列に分割する方法を変えながら、別の行列を構成する。例えば、１６ビットの索引は、５１２列の１２８ページ（７×９ビット）、１２８列の５１２ページ（９×７ビット）１０２４列の６４ページ（６×１０ビット）等々のように分割することができる。特定のループ反復により、以前の最良の分割が改善される場合には、そのページオフセット表および付随する統計を前のものと置換し、それによって全ての（適正な）分割を試みた後、最少量の空間を使用する分割が最終的に残る（ステップ８１２）。上述の写像動作は充分に高速であるので、この方法により得られる最適写像法が認識されるまで、全ての実際的な組合せを試みることができることに注目されたい。さらに、上述のとおり、いったん行と列に分割した上で、重ねられるページを垂直方向および水平方向から観察して、最適可能なパッキングを見つけだすことができる。最適写像が見つかったら、そのためのオフセット表４２を使用して、ステップ８１４において元の表エントリを密な、またはほとんど密なハッシュ表４０に書き込むことができる。
【００４７】
ページオフセット表を使用してハッシュ表に対するハッシュ値索引を計算する方法について説明する。図２１に別のコンピュータシステムが示されている。図２１では、図１の場合と同様の構成要素に対しては、図１における符号より１０００高い符号を使用した。例えば比較的パワーの低いハンドヘルドコンピュータ装置とすることができるこのシステム１０２０では、記憶装置１０２４は、ユニコード文字などのような選択された文字を表示する目的などのために、完成したハッシュ表１０４０およびページオフセット表１０４２を含む。したがって、本発明の第二態様は、元の大きい表３８のキーから、密なハッシュ表１０４０に対する索引として機能するハッシュ値１０４４への変換を取り扱う。表１０４０および１０４２は一般的に、ＲＯＭまたは類似物にバーンインするなど、不揮発性メモリに格納される。
【００４８】
ハッシュ計算を達成するために、アプリケーションプログラム１０４８または類似物が最初に、ページオフセット表１０４２およびハッシュ表１０４０を記憶装置１０２４にロードする（またはすでにロードされている場合には、探し出す）（図２２のステップ１１００）。キー１０４６（入力値）をアプリケーションプログラム１０４８または類似物が受け取り、ハッシュ計算プロセス１０５０に渡し、それによりステップ１１０４（図２２）で、値は最初に同一ビットグループに分割され、これはページオフセット表１０４２を構成するために使用される。ビット分割は、ページオフセット表１０４２の大きさから明らかである。すなわち、ページオフセット表１０４２のエントリの数がページの数に等しく、したがってページのオフセット情報を格納するために使用されるビット数を表す。例えば、１２８個のエントリは７ビットに対応する。いうまでもなく、分割およびその他の情報（例えば、対応するハッシュ表のファイル名）もまた、ページオフセット表１０４２によりヘッダ情報または類似物に維持することができる。
【００４９】
いかなる場合でも、初期の大きい表３８に対応する入力値を受け取ると（垂直方向の列がページになる場合）、値の高位部分がステップ１１０４の一ステップとして計算プロセス１０４８によってマスクされ、ページ番号を表す適切な数の有効な低位ビットが残される。簡単な例で、４つの可能なビットのうち２つのビットが高位部分に当たり、したがって上位の２ビットがマスクされる。残りの２ビットは、オフセット表１０４２への零を基底とする索引として使用される。例えば「Ｇ」文宇を表示する目的などのために、０１１０ｂを受け取ると、上位ビットがマスクされ、１０ｂが残る。同様に、ステップ１１０４内で、マスクされない上位ビットをページ番号内のビットの数と同数だけ右にシフトすることによって、ページ内へのオフセットを表す上位ビットが得られる。
【００５０】
ステップ１１０６で、ページ番号は、ページオフセット表１０４２への索引として使用され、それによって対応するページのオフセット値を決定するために探索動作が実行される。本実施例では、１０ｂから３のオフセット値が得られる。
【００５１】
ステップ１１０８で、この値はページ内へのオフセットに追加される（ステップ１１０４における上位ビットのマスキングおよびシフトから決定される０１ｂに等しい）。結果（３＋１＝４）がハッシュ表１０４０に対する計算されたハッシュ値索引であり、ステップ１１１０でアプリケーションプログラム１０４８に返され、アプリケーションプログラムは次にハッシュ表１０４０から適切なデータを獲得する。お分かりのように、図１８のハッシュ表４０の４個（１００ｂ）のエントリは、適切に「Ｇ」文字を索引付けする。下表は全ての有効な計算の結果を示すが、これについて本書ではそれ以上詳しく説明しない。
【００５２】
【表１】
2011003214.tif 000003
【００５３】
ご理解いただけるように、計算はＡＮＤ（論理和）（マスキングのため）、シフト、配列の索引付け（ページオフセット表１０４２）、および加算のみで構成され、きわめて高速である。
【００５４】
正確な結果を出すために、ハッシュ計算は有効な入力値、すなわちハッシュ表を使用するアプリケーションプログラムによってサポートされる入力値を必要とすることに注意すべきである。ハッシュ計算を実行する前に、有効性検査（ステップ１１０２で表されるような）を値に実行して、有効な入力に対応することを確認することができる。入力値が有効であれば、有効なキーから衝突の無い一意の結果が得られるので、ハッシュは完全である。
【００５５】
さらに、ハッシュ表データ自体以外に、ハッシュ値を計算し続けるために必要なものはオフセット表だけである。したがって、合成ビットマップおよび統計など、オフセット表の作成中に蓄積されたその他の情報は廃棄することができる。
【００５６】
いうまでもなく、例えば２つ以上をシステムで利用できる場合には、アプリケーションプログラムが適切なハッシュ表および対応するオフセット表をロードできるようにするために、必要とあらば、幾つかのメタデータおよび／またはその他の情報をオフセット表および／またはハッシュ表と共に維持することもできる。
【００５７】
以上の詳細な説明から分かるように、より大きい範囲の不連続値の任意の部分集合に対する完全なハッシュを生成する方法および機構を提供する。この方法および機構は、ハッシュ値の非常に高速な計算を可能にしながら、ハッシュ値を一緒に密にパックするものである。この方法および機構は、自動的に作動し、不連続ユニコード点の部分集合で特によく機能する。この方法および機構は、高速であり、信頼でき、費用効果が高く、柔軟であり、拡張性がある。
【００５８】
本発明は、様々な変更および代替構成が可能であるが、その特定の例示的実施形態を図面に示し、以上に詳細に記述した。しかし、本発明を開示した特定の形態に限定する意図はなく、反対に、本発明は、本発明の精神および範囲に該当する全ての変更、代替構成、および均等物を網羅するものであることを理解されたい。
【図１】
2011003214.tif 000004
【図２】
2011003214.tif 000005
【図３】
2011003214.tif 000006
【図４】
2011003214.tif 000007
【図５】
2011003214.tif 000008
【図６】
2011003214.tif 000009
【図７】
2011003214.tif 000010
【図８】
2011003214.tif 000011
【図９】
2011003214.tif 000012
【図１０】
2011003214.tif 000013
【図１１】
2011003214.tif 000014
【図１２】
2011003214.tif 000015
【図１３】
2011003214.tif 000016
【図１４】
2011003214.tif 000017
【図１５】
2011003214.tif 000018
【図１６】
2011003214.tif 000019
【図１７】
2011003214.tif 000020
【図１８】
2011003214.tif 000021
【図１９】
2011003214.tif 000022
【図２０】
2011003214.tif 000023
【図２１】
2011003214.tif 000024