(57)【特許請求の範囲】
【請求項１】
被検索文字列を１文字ずつ文字列検索装置に入力し、該文字列検索装置において、状態遷移メモリに格納されている状態遷移表を参照して複数の検索処理を行なうことにより、あらかじめ与えられた１つ以上のパターンが、別途与えられた被検索文字列の中に部分文字列として存在するか否かを判定するデータ検索方法であって、
（ａ）被検索文字の夫々と文字コードとの対応関係を前記文字列検索装置に予め保持しておき、その対応関係を参照することにより、前記文字列検索装置にラッチした被検索文字に対応する文字コードを得ると共に、ハッシュ関数レジスタに保持している直前の検索処理で求めたハッシュ関数を該文字コードに適用して、ハッシュ演算器を用いて該文字コードに関するハッシュ値を求め、
（ｂ）該ハッシュ値を、前記直前の検索処理で求めた前記状態遷移メモリのアドレスに加えて新たなアドレスを求め、
（ｃ）該新たなアドレスに格納されている状態遷移の条件となる照合文字と、状態遷移が確定するか否かを示す複数の遷移確定フラグと、前記あらかじめ与えられたパターンを識別する複数のパターン番号と、複数のハッシュ関数と、複数の状態遷移メモリのアドレスのそれぞれを、前記新たなアドレスに基づいて前記状態遷移メモリを参照することによって前記状態遷移表から読み出し、
（ｄ）前記ラッチした被検索文字が状態遷移の条件となる該照合文字に一致しているか否かを比較器を用いて判断し、前記新たなアドレスに格納されているところの、前記複数の遷移確定フラグと、前記複数のパターン番号と、前記複数のハッシュ関数と、前記複数の状態遷移メモリのアドレスのそれぞれの中から1つずつを、前記比較器の出力に基づいて動作するセレクタを介して次の検索処理で使用するために選択し、
（ｅ）前記選択された遷移確定フラグが状態遷移の確定を示す場合に、前記選択されたパターン番号に対応する前記あらかじめ与えられたパターンが前記被検索文字列の中に存在すると判定すると共に、前記被検索文字列における次の前記被検索文字を前記文字列検索装置にラッチする、
という一連の処理を繰り返すことにより、前記あらかじめ与えられたパターンが、前記被検索文字列の中に存在するかどうかをと判定することを特徴とするデータ検索方法。
【請求項２】
被検索文字列を１文字ずつ文字列検索装置に入力し、該文字列検索装置において、状態遷移メモリに格納されている状態遷移表を参照して複数の検索処理を行なうことにより、あらかじめ与えられた１つ以上のパターンが、別途与えられた被検索文字列の中に部分文字列として存在するか否かを判定するデータ検索装置であって、
被検索文字の夫々と文字コードとの対応関係を予め保持しておき、その対応関係を参照することにより、ラッチした被検索文字に対応する文字コードを得ると共に、ハッシュ関数レジスタに保持している直前の検索処理で求めたハッシュ関数を該文字コードに適用して、該文字コードに関するハッシュ値を求めるハッシュ演算器と、
前記ハッシュ演算器によって求めたハッシュ値を、前記直前の検索処理で求めた前記状態遷移メモリのアドレスに加えて新たなアドレスを求める加算器と、
前記新たなアドレスに格納されている状態遷移の条件となる照合文字と、状態遷移が確定するか否かを示す複数の遷移確定フラグと、前記あらかじめ与えられたパターンを識別する複数のパターン番号と、複数のハッシュ関数と、複数の状態遷移メモリのアドレスのそれぞれを、前記新たなアドレスに基づいて前記状態遷移メモリを参照することによって前記状態遷移表から読み出すメモリ読み出し手段と、
前記ラッチした被検索文字が状態遷移の条件となる前記照合文字に一致しているか否かを比較する比較器と、
前記新たなアドレスに格納されているところの、前記複数の遷移確定フラグと、前記複数のパターン番号と、前記複数のハッシュ関数と、前記複数の状態遷移メモリのアドレスのそれぞれの中から、次の検索処理で使用するために前記比較器の出力に基づいて1つずつ選択するセレクタと、
前記選択された遷移確定フラグが状態遷移の確定を示す場合に、前記選択されたパターン番号に対応する前記あらかじめ与えられたパターンが前記被検索文字列の中に存在すると判定すると共に、前記被検索文字列における次の前記被検索文字を前記文字列検索装置にラッチする判定手段と
を備えることを特徴とするデータ検索装置。
【請求項３】
あらかじめ与えられた１つ以上のパターンが、別途与えられた被検索文字列の中に部分文字列として存在するか否かを、被検索文字列を１文字ずつ取り込みながら、状態遷移メモリに格納されている状態遷移表を参照して行う複数の検索処理を、コンピュータに実現させるためのコンピュータ・プログラムであって、そのコンピュータ・プログラムを該コンピュータに実行させることにより、
（ａ）被検索文字の夫々と文字コードとの対応関係を予め保持しておき、その対応関係を参照することにより、取り込んだ被検索文字に対応する文字コードを得ると共に、保持している直前の検索処理で求めたハッシュ関数を該文字コードに適用して、該文字コードに関するハッシュ値を求め、
（ｂ）該ハッシュ値を、前記直前の検索処理で求めた前記状態遷移メモリのアドレスに加えて新たなアドレスを求め、
（ｃ）該新たなアドレスに格納されている状態遷移の条件となる照合文字と、状態遷移が確定するか否かを示す複数の遷移確定フラグと、前記あらかじめ与えられたパターンを識別する複数のパターン番号と、複数のハッシュ関数と、複数の状態遷移メモリのアドレスのそれぞれを、前記新たなアドレスに基づいて前記状態遷移メモリを参照することによって前記状態遷移表から読み出し、
（ｄ）前記取り込んだ被検索文字が状態遷移の条件となる該照合文字に一致しているか否かを判断し、その判断結果に応じて、前記新たなアドレスに格納されているところの、前記複数の遷移確定フラグと、前記複数のパターン番号と、前記複数のハッシュ関数と、前記複数の状態遷移メモリのアドレスのそれぞれの中から1つずつを、次の検索処理で使用するために選択し、
（ｅ）前記選択された遷移確定フラグが状態遷移の確定を示す場合に、前記選択されたパターン番号に対応する前記あらかじめ与えられたパターンが前記被検索文字列の中に存在すると判定すると共に、前記被検索文字列における次の前記被検索文字を取り込む、
ことを特徴とするコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、あらかじめ与えられた１つ以上のパターンが、別途与えられた文字列の中に部分文字列として存在するか否かを判定するデータ検索技術に関する。
【背景技術】
【０００２】
入力されたデータの中に特定のパターンが存在するか否かを判定する技術は、情報処理分野における要素技術であり、その用途は多岐にわたる。例えば、ワードプロセッサでのテキスト検索、バイオテクノロジーにおけるＤＮＡ解析、電子メールなどに潜むコンピュータウィルスの検知、等である。
【０００３】
特に、パターンが複数個存在し、かつ、それぞれのパターンが一意である場合に適した検索アルゴリズムとしてAho-Corasick法（非特許文献１）が広く知られている。
【０００４】
Aho-Corasick法について簡単に説明する。Aho-Corasick法は、検索される対象の文字列（テキスト等）の先頭から１文字ずつ取り出しながら、状態遷移図に従って状態遷移を繰り返すことで検索を達成する。
【０００５】
図２は、状態遷移図の一例であり、５つのパターンＡＢＣ、ＡＢＤ、ＡＢＥ、ＡＢＦ、ＢＡを検索するためのものである。円で囲まれた数字が状態を示し、実線の矢印が状態遷移を表す。状態遷移の結果、２重の円で囲まれた状態へ到達すると、その状態に対応するパターンが検出されたことになる。例えば、図２においては、状態“５”に到達したらパターンＡＢＣが発見されたことになる。
【０００６】
実線の矢印に付与されている文字は、状態遷移するための条件となる文字である。また、点線の矢印は、失敗遷移を表す。ある状態において入力された文字に対応する状態遷移が存在しなかったとき、その状態の失敗遷移先の状態へ移動して、移動後の状態からの状態遷移を再度試みる。
【０００７】
例として、図２において、状態“３”にいるときに文字Ａが入力された際の遷移先を考える。状態“３”から文字Ａで次の状態へ遷移できないため、状態“３”からの失敗遷移を辿って状態“２”へ移動する。状態“２”からは文字Ａで状態“４”へ遷移できるから、遷移先は状態“４”となり、パターンＢＡが検索される。なお、図２では状態“０”への失敗遷移は省略されている。
【０００８】
Aho-Corasick法を実現する従来の技術について述べる。
【０００９】
広く利用されている従来技術として、全ての状態と全ての文字についての遷移先が列挙された状態遷移表を用いる方法がある。以後、この方法を従来技術１と称する。
【００１０】
図１３は、従来技術１における状態遷移表であり、図２の状態遷移図から生成されたものである。現在の状態と入力文字が決まれば、この状態遷移表を１度だけ参照して、次の状態を決定できる。例えば、現在の状態が状態“３”で入力文字がＡであったら、図１３の状態遷移表を参照して、次の状態である状態“４”を即時に得られる。状態“０”から開始し、入力された文字列の中の文字について順次この操作を繰り返すことで、文字列検索を達成する。
【００１１】
状態遷移表をコンパクトに表現して必要メモリ量を削減する従来技術として非特許文献２に記載されたBitmapped Aho-Corasick法がある。以後、この方法を従来技術２と称する。
【００１２】
従来技術２の最大の特徴は、次の状態へ遷移できるかどうかを文字ごとに０と１のビットマップで表現することである。図１４は、従来技術２における状態遷移表であり、図２の状態遷移図から生成されたものである。図１４のビットマップ９２０は、状態ごとに存在し、それぞれ文字の種類の数に等しい長さを持つ。ビットマップ９２０の、ある文字に対応するビットが１であるとき、その文字によって次の状態へ遷移できることになる。ある文字に対応するビットが０であるとき、その文字に関しては次の状態へ遷移できず、失敗遷移を辿ることになる。失敗遷移先９２２が、失敗遷移先の状態の番号である。
【００１３】
次状態９２１は、状態遷移に成功したときの、次の状態の番号である。ただし、次の状態が複数存在する場合は、それらの番号のうち最小のものになる。例えば、図２の状態遷移図においては、状態“３”から状態“５”、“６”、“７”、“８”へ遷移できる。従って、状態“３”の次状態９２１は、これらの番号の最小値である５となる。
【００１４】
従来技術２の動作について図１４の状態遷移表を用いて簡潔に説明する。例として、現在の状態が状態“３”で入力文字がＥであるとする。はじめに、状態“３”のビットマップ９２０の文字Ｅに対応するビットを調べる。そのビットは１であるから、状態“３”から文字Ｅで次の状態へ遷移できることが分かる。次に、文字Ｅによって具体的にどの状態に遷移するかを求める。状態“３”のビットマップ９２０の文字Ｅに対応するビットより左にあるビットのうち、１が立っているビットの個数を計数する。この場合、文字Ａ、Ｂ、Ｃ、Ｄに対応するビットを調べる。文字Ａに対応するビットは０、Ｂは０、Ｃは１、Ｄは１であるから、１が立っているビットの個数は２となる。１が立っているビットの個数と、状態“３”の次状態９２１の和、すなわち７（＝２＋５）が、次の状態の番号になる。従って、状態“３”から文字Ｅで状態“７”へ遷移できたことになる。
【発明の開示】
【発明が解決しようとする課題】
【００１５】
従来技術１には、文字の種類の数が多くなると状態遷移表を格納するためのメモリの容量が大きくなるという欠点がある。従来技術１の状態遷移表（図１３）は、全ての状態の数と全ての文字の種類の数の積に等しい数のエントリを有する。文字の種類の数に正比例して必要なメモリの量が増加するため、文字の種類の数が２５６や６５５３６のように多くなると、この問題は無視できないほど顕著になる。
【００１６】
一方、従来技術２には、文字の種類の数が多くなると状態遷移の際の計算量が増加し検索速度が低下するという欠点と、文字の種類の数が多くなると状態遷移表を格納するためのメモリの容量が大きくなるという欠点がある。前述のように従来技術２においては、遷移先を求める際に、ビットマップ中の１が立っているビットの数を計数する。ビットマップの幅は文字の種類の数に等しいから、入力文字が均一に分布すると仮定すると、平均的に｛（文字の種類の数）−１｝÷２個のビットについて、それらのビットが１であるか否かを判定しなければならない。例えば、文字の種類の数が２５６の場合、ビットマップの幅は２５６ビットであるから、１回の状態遷移で平均的に１２７．５ビットについて０か１かを判定することになり、多くの計算資源が消費される。また、ビットマップの幅は文字の種類の数に等しいから、文字の種類の数が多くなると状態遷移表を格納するためのメモリの量も増大する。
【００１７】
【非特許文献１】著者：A. V. Aho and M.J.Corasick、題目：Efficient String Matching: An Aid to Bibliographic Search、出典：Communications of the ACM, 18(6):333-340, June 1975
【非特許文献２】著者：N. Tuck, T. Sherwood, B.Calder, and G. Varghese、題目：DeterministicMemory-Efficient String Matching Algorithms for Intrusion Detection、出典：In Proceedings of the IEEE Infocom Conference [1], 0-7803-8356-7/04,2004
【課題を解決するための手段】
【００１８】
本発明の目的は、状態遷移表を格納するためのメモリの量および検索速度が、文字の種類の数にほとんど依存しない文字列検索装置および文字列検索方法、並びにコンピュータ・プログラムを提供することにある。
【００１９】
この目的を達成するため、本発明は、被検索文字列を１文字ずつ文字列検索装置に入力し、該文字列検索装置において、状態遷移メモリに格納されている状態遷移表を参照して複数の検索処理を行なうことにより、あらかじめ与えられた１つ以上のパターンが、別途与えられた被検索文字列の中に部分文字列として存在するか否かを判定するデータ検索方法であって、
（ａ）被検索文字の夫々と文字コードとの対応関係を前記文字列検索装置に予め保持しておき、その対応関係を参照することにより、前記文字列検索装置にラッチした被検索文字に対応する文字コードを得ると共に、ハッシュ関数レジスタに保持している直前の検索処理で求めたハッシュ関数を該文字コードに適用して、ハッシュ演算器を用いて該文字コードに関するハッシュ値を求め、
（ｂ）該ハッシュ値を、前記直前の検索処理で求めた前記状態遷移メモリのアドレスに加えて新たなアドレスを求め、
（ｃ）該新たなアドレスに格納されている状態遷移の条件となる照合文字と、状態遷移が確定するか否かを示す複数の遷移確定フラグと、前記あらかじめ与えられたパターンを識別する複数のパターン番号と、複数のハッシュ関数と、複数の状態遷移メモリのアドレスのそれぞれを、前記新たなアドレスに基づいて前記状態遷移メモリを参照することによって前記状態遷移表から読み出し、
（ｄ）前記ラッチした被検索文字が状態遷移の条件となる該照合文字に一致しているか否かを比較器を用いて判断し、前記新たなアドレスに格納されているところの、前記複数の遷移確定フラグと、前記複数のパターン番号と、前記複数のハッシュ関数と、前記複数の状態遷移メモリのアドレスのそれぞれの中から1つずつを、前記比較器の出力に基づいて動作するセレクタを介して次の検索処理で使用するために選択し、
（ｅ）前記選択された遷移確定フラグが状態遷移の確定を示す場合に、前記選択されたパターン番号に対応する前記あらかじめ与えられたパターンが前記被検索文字列の中に存在すると判定すると共に、前記被検索文字列における次の前記被検索文字を前記文字列検索装置にラッチする、
という一連の処理を繰り返すことにより、前記あらかじめ与えられたパターンが、前記被検索文字列の中に存在するかどうかをと判定する。
【００２１】
更に上述の目的達成のため、本発明のデータ検索装置は、被検索文字列を１文字ずつ文字列検索装置に入力し、該文字列検索装置において、状態遷移メモリに格納されている状態遷移表を参照して複数の検索処理を行なうことにより、あらかじめ与えられた１つ以上のパターンが、別途与えられた被検索文字列の中に部分文字列として存在するか否かを判定するデータ検索装置であって、
被検索文字の夫々と文字コードとの対応関係を予め保持しておき、その対応関係を参照することにより、ラッチした被検索文字に対応する文字コードを得ると共に、ハッシュ関数レジスタに保持している直前の検索処理で求めたハッシュ関数を該文字コードに適用して、該文字コードに関するハッシュ値を求めるハッシュ演算器と、
前記ハッシュ演算器によって求めたハッシュ値を、前記直前の検索処理で求めた前記状態遷移メモリのアドレスに加えて新たなアドレスを求める加算器と、
前記新たなアドレスに格納されている状態遷移の条件となる照合文字と、状態遷移が確定するか否かを示す複数の遷移確定フラグと、前記あらかじめ与えられたパターンを識別する複数のパターン番号と、複数のハッシュ関数と、複数の状態遷移メモリのアドレスのそれぞれを、前記新たなアドレスに基づいて前記状態遷移メモリを参照することによって前記状態遷移表から読み出すメモリ読み出し手段と、
前記ラッチした被検索文字が状態遷移の条件となる前記照合文字に一致しているか否かを比較する比較器と、
前記新たなアドレスに格納されているところの、前記複数の遷移確定フラグと、前記複数のパターン番号と、前記複数のハッシュ関数と、前記複数の状態遷移メモリのアドレスのそれぞれの中から、次の検索処理で使用するために前記比較器の出力に基づいて1つずつ選択するセレクタと、
前記選択された遷移確定フラグが状態遷移の確定を示す場合に、前記選択されたパターン番号に対応する前記あらかじめ与えられたパターンが前記被検索文字列の中に存在すると判定すると共に、前記被検索文字列における次の前記被検索文字を前記文字列検索装置にラッチする判定手段とを備える。
【発明の効果】
【００２２】
本発明によれば、入力された文字そのものではなく、文字にハッシュ関数を適用した結果のハッシュ値をインデックスとして状態遷移表を参照するため、状態遷移表の大きさや状態遷移の際の計算量は、文字の種類の数による影響をほとんど受けない。従って、文字の種類の数が多い場合、従来の技術と比較して、状態遷移表を格納するためのメモリの量を削減し、文字列検索を高速化することができる。
【００２３】
また、本発明によれば、ハッシュ関数は全体で１つではなく状態ごとに別々に定義されるため、それぞれの状態においてハッシュ値のとりうる範囲ができるだけ狭くなるようなハッシュ関数を選択することにより、状態遷移表を格納するためのメモリの量を削減することができる。
【発明を実施するための最良の形態】
【００２５】
次に、本発明の実施の形態について図面を参照して詳細に説明する。
〔実施の形態の構成〕
図１は、本発明の実施形態の一例を示すブロック図である。
【００２６】
文字列検索装置１は、検索される文字列すなわち被検索文字列をその先頭から順に１文字ずつ被検索文字１０１として外部から取り込みながらパターンを検索し、検出したパターンを表すパターン番号１０３を出力する。文字列検索装置１に取り込まれる被検索文字列は、必ずしもある文字列の先頭の文字からである必要はなく、文字列の任意の文字から始まる「検索したい文字列」を指すことは勿論である。
【００２７】
パターンは、検索開始前に、後述する手順に従って状態遷移表に変換され、その状態遷移表が文字列検索装置１の内部の状態遷移メモリ２３に格納される。文字列検索装置１は、状態遷移メモリ２３に格納された状態遷移表を参照して状態遷移しながら、パターンを検索する。
【００２８】
クロック信号１００は、文字列検索装置１を駆動させるクロックである。説明を容易にするため、文字列検索装置１は、クロック信号１００の立ち上がりに同期して動作するものとする。
【００２９】
被検索文字１０１は、被検索文字列に含まれる１文字である。文字列検索装置１が出力する遷移確定フラグ１０２が１になるたびに、被検索文字列中の次の文字が被検索文字１０１として文字列検索装置１に順次入力されるものとする。なお、本発明における文字とは、人間が認識可能な文字だけでなく、バイナリデータも含む。また、文字を表現するために必要なビット数に制限はない（１文字が８ビットで表現されても良いし、１６ビットで表現されても差し支えない）。
【００３０】
被検索文字レジスタ２０は、遷移確定フラグ１０２が１のとき、または検索の開始時に、クロック信号１００の立ち上がりで被検索文字１０１をラッチし、ラッチ後の値を被検索文字１２０として出力する。
【００３１】
ハッシュ演算器２１は、被検索文字の夫々に対応する文字コードを予め保持しており、被検索文字レジスタ２０から入力された被検索文字１２０に対応する文字コードをハッシュ関数１３３に代入し、その計算結果をハッシュ値１２１として出力する。例えば、被検索文字１２０の文字コードが７で、ハッシュ関数１３３がｘ％３であるとき、ハッシュ値１２１は１（＝７％３）になる。ここで、記号「％」は剰余を表す演算子である。
【００３２】
加算器２２は、ハッシュ値１２１と次状態アドレス１３４を算術的に加算し、その和をアドレス１２２として出力する。
【００３３】
状態遷移メモリ２３は、パターンから生成された状態遷移表を格納する。図６は、状態遷移メモリ２３の内部構造と、実際の格納の例である。状態遷移メモリ２３の入力は、アドレス１２２である。状態遷移メモリ２３の出力は、アドレス１２２に対応するアドレスの、照合文字１２３、一致時遷移確定フラグ１２４、一致時パターン番号１２６、一致時ハッシュ関数１２８、一致時次状態アドレス１３０、不一致時遷移確定フラグ１２５、不一致時パターン番号１２７、不一致時ハッシュ関数１２９、不一致時次状態アドレス１３１である。
【００３４】
比較器２４は、被検索文字１２０と照合文字１２３が一致しているかを判定する。一致していれば一致フラグ１３２を１にし、一致していなければ０にする。なお、照合文字については後述する。
【００３５】
セレクタ２５は、一致フラグ１３２が１のとき一致時遷移確定フラグ１２４を選択し、０のとき不一致時遷移確定フラグ１２５を選択する。セレクタ２５の出力は、遷移確定フラグ１０２として文字列検索装置１の外部に出力されると共に、被検索文字レジスタ２０にも加えられる。遷移確定フラグ１０２は、その値が１のとき現在の被検索文字１０１に関する処理が完了したことを示し、０のとき未だ処理途中であることを示すフラグである。
【００３６】
セレクタ２６は、一致フラグ１３２が１のとき一致時パターン番号１２６を選択し、０のとき不一致時パターン番号１２７を選択する。セレクタ２６の出力がパターン番号１０３となり、文字列検索装置１の外部に出力される。パターン番号１０３は、パターン検出の有無を示すとともに、どのパターンが検出されたかを識別するための情報である。パターンが検出されると、パターン番号１０３は０以外の数値になり、検出されたパターンに付与されているパターン番号を表すパターン番号１０３は、遷移確定フラグ１０２が１のときに限り有効である。
【００３７】
セレクタ２７は、一致フラグ１３２が１のとき一致時ハッシュ関数１２８を選択し、０のとき不一致時ハッシュ関数１２９を選択する。
【００３８】
セレクタ２８は、一致フラグ１３２が１のとき一致時次状態アドレス１３０を選択し、０のとき不一致時次状態アドレス１３１を選択する。
【００３９】
ハッシュ関数レジスタ２９は、クロック信号１００の立ち上がりでセレクタ２７の出力をラッチし、ラッチ後の値をハッシュ関数１３３として出力する。
【００４０】
次状態アドレスレジスタ３０は、クロック信号１００の立ち上がりでセレクタ２８の出力をラッチし、ラッチ後の値を次状態アドレス１３４として出力する。
【００４１】
文字列検索装置１の状態遷移メモリ２３の内容を決定する方法について、具体例を用いて説明する。
【００４２】
状態遷移メモリ２３の内容を求めるには、はじめにパターンからAho-Corasick法に基づいて状態遷移図を作成し、次に状態遷移図に対してハッシュ関数と照合文字による分類を施して状態遷移表を作り、最後に状態遷移表を状態遷移メモリ２３の内容へ変換する。
【００４３】
本明細書では簡単のため、文字の集合を｛Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝のみとし、それぞれ図１０に示すように文字コードを割り当てる。また、パターンはＡＢＣ、ＡＢＤ、ＡＢＥ、ＡＢＦ、ＢＡの５種類とし、それぞれのパターンに対して図３のようにパターン番号を割り当てる。
【００４４】
図２は、パターンからAho-Corasick法に基づいて作成された状態遷移図である。この状態遷移図の中の各状態についてハッシュ関数と照合文字による分類を施し、状態遷移表を作る手順について述べる。
【００４５】
はじめに、状態“０”に着目する。状態“０”のハッシュ関数ｆ０（ｘ）をｆ０（ｘ）＝ｘ％２と定義する。ハッシュ関数の好適な形状は、ｘ％Ｎ（Ｎは自然数）である。それが好適である理由は３点ある。１つ目の理由は、計算が容易であるからである。２つ目の理由は、ハッシュ値が０〜（Ｎ−１）の範囲内の連続した値をとるため、状態遷移メモリ２３に間隙なく情報を配置でき、状態遷移メモリ２３の容量を小さくできるからである。３つ目の理由は、除数であるＮさえ分かればハッシュ関数を復元できるため、ハッシュ関数を表現するために必要な情報の量を少なくでき、状態遷移メモリ２３の容量を小さくできるからである。言うまでもなく、ｘ％Ｎ以外のハッシュ関数であっても条件を満たしていれば使用できる。ハッシュ関数の要件については後述する。
【００４６】
状態“０”でのハッシュ値を求めるには、図１０を参照して文字に対応する文字コード“ｘ”を得てｆ０（ｘ）を計算する。全ての文字についてハッシュ値を計算した結果を図１１の第３行目に示す。なお、図１１の第２行目は図１０の第２行目と同じである。ハッシュ関数から明らかなように、状態“０”のハッシュ値は０、１のいずれかである。ハッシュ値をキーとして文字の集合｛Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝を分類し、２つの領域を作る。ハッシュ値“０”に対応する領域は図１１より｛Ａ、Ｃ、Ｅ、Ｇ｝であり、ハッシュ値“１”に対応する領域は｛Ｂ、Ｄ、Ｆ｝である。
【００４７】
さらに、各領域を２つの小領域に分割する。一方の小領域は、現在の状態から次の状態へ遷移するための文字を１つだけ含む。他方の小領域は、それ以外の文字の集合である。状態“０”から次の状態へ遷移するための文字は、図２よりＡ、Ｂである。そこで、ハッシュ値“０”に対応する領域｛Ａ、Ｃ、Ｅ、Ｇ｝を、文字Ａとそれ以外の文字の集合とに分割して、｛Ａ｝と｛Ｃ、Ｅ、Ｇ｝の２つの小領域を作成する。同様に、ハッシュ値“１”に対応する領域｛Ｂ、Ｄ、Ｆ｝を、文字Ｂとそれ以外の文字の集合とに分割して、｛Ｂ｝と｛Ｄ、Ｆ｝の２つの小領域を作成する。領域の分割に使用した文字を、照合文字と呼ぶ。この場合、ハッシュ値“０”に対応する領域の照合文字はＡであり、ハッシュ値“１”に対応する領域の照合文字はＢである。即ち、照合文字とは現在の状態から次の状態へ遷移するための文字をいう。
【００４８】
その後、４つの小領域｛Ａ｝、｛Ｃ、Ｅ、Ｇ｝、｛Ｂ｝、｛Ｄ、Ｆ｝のそれぞれについて遷移先を求める。図２より、小領域｛Ａ｝の遷移先は状態“１”に確定し、小領域｛Ｂ｝の遷移先は状態“２”に確定する。一方、文字Ｃ、Ｄ、Ｅ、Ｆ、Ｇについては状態“０”から次の状態へ遷移できない。状態“０”は初期状態であるから失敗遷移は定義されておらず、これ以上あと戻りできないため、小領域｛Ｃ、Ｅ、Ｇ｝および｛Ｄ、Ｆ｝の遷移先は状態“０”に確定する。
【００４９】
上記から、状態“０”に関して以下の情報が得られる：
ハッシュ関数はｆ０（ｘ）＝ｘ％２である
ハッシュ値“０”に対応する領域の照合文字はＡである
ハッシュ値“１”に対応する領域の照合文字はＢである
ハッシュ値“０”に対応する領域については、照合文字の遷移先は状態“１”に確定し、照合文字以外の文字の遷移先は状態“０”に確定する
ハッシュ値“１”に対応する領域については、照合文字の遷移先は状態“２”に確定し、照合文字以外の文字の遷移先は状態“０”に確定する。
【００５０】
次に、状態“１”に着目する。状態“１”のハッシュ関数ｆ１（ｘ）をｆ１（ｘ）＝ｘ％１と定義する。全ての文字についてハッシュ値を計算した結果を図１１の第４行目に示す。ハッシュ関数から明らかなように、状態“１”のハッシュ値は０しかとらない。従って、この場合はハッシュ値をキーとして文字の集合を分類する必要はない。状態“１”から次の状態へ遷移するための文字は、図２よりＢである。そこで、ハッシュ値“０”に対応する領域｛Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝を、文字Ｂとそれ以外の文字の集合とに分割して、｛Ｂ｝と｛Ａ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝の２つの小領域を作成する。
【００５１】
その後、２つの小領域｛Ｂ｝、｛Ａ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝のそれぞれについて遷移先を求める。図２より、小領域｛Ｂ｝の遷移先は状態“３”に確定する。
【００５２】
小領域｛Ａ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝の遷移先について考える。文字Ａ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇは、いずれも、状態“１”から次の状態へ遷移できないため、失敗遷移を辿ることになる。状態“１”の失敗遷移先は、図２より状態“０”になる。ここで、文字Ａについては、状態“０”から状態“１”へ遷移できる。しかし、それ以外の文字Ｃ、Ｄ、Ｅ、Ｆ、Ｇについては、状態“０”から次の状態へ遷移できない。従って、状態“０”の次の時点で、小領域｛Ａ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝の遷移先が１通りに定まらなくなる。そのため、小領域｛Ａ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝の遷移先は状態“０”となり、その遷移は不確定として扱われる。
【００５３】
このように、小領域の中に複数の文字が含まれている場合は、それらの遷移先が分岐するまで失敗遷移を辿り、遷移先が分岐する直前の状態を小領域の遷移先とする。また、この場合の遷移は不確定として扱われる。
【００５４】
上記から、状態“１”に関して以下の情報が得られる：
ハッシュ関数はｆ１（ｘ）＝ｘ％１である
ハッシュ値“０”に対応する領域の照合文字はＢである
ハッシュ値“０”に対応する領域については、照合文字の遷移先は状態“３”に確定するが、照合文字以外の文字の遷移先は状態“０”かつ不確定である。
【００５５】
次に、状態“２”に着目する。状態“２”のハッシュ関数ｆ２（ｘ）をｆ２（ｘ）＝ｘ％１と定義する。全ての文字についてハッシュ値を計算した結果を図１１の第５行目に示す。ハッシュ関数から明らかなように、状態“２”のハッシュ値は０しかとらない。状態“２”から次の状態へ遷移するための文字は、図２よりＡである。そこで、ハッシュ値“０”に対応する領域｛Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝を、文字Ａとそれ以外の文字の集合とに分割して、｛Ａ｝と｛Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝の２つの小領域を作成する。
【００５６】
２つの小領域｛Ａ｝、｛Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝のそれぞれの遷移先を求める方法は、状態“１”と同様であるので、その説明を省略する。
【００５７】
上記から、状態“２”に関して以下の情報が得られる：
ハッシュ関数はｆ２（ｘ）＝ｘ％１である
ハッシュ値“０”に対応する領域の照合文字はＡである
ハッシュ値“０”に対応する領域については、照合文字の遷移先は状態“４”に確定するが、照合文字以外の文字の遷移先は状態“０”かつ不確定である。
【００５８】
次に、状態“３”に着目する。状態“３”のハッシュ関数ｆ３（ｘ）をｆ３（ｘ）＝ｘ％３と定義する。全ての文字についてハッシュ値を計算した結果を図１１の第６行目に示す。ハッシュ関数から明らかなように、状態“３”のハッシュ値は０、１、２のいずれかである。ハッシュ値をキーとして文字の集合を分類し、３つの領域を作る。ハッシュ値“０”に対応する領域は図１１より｛Ａ、Ｄ、Ｇ｝であり、ハッシュ値“１”に対応する領域は｛Ｂ、Ｅ｝、ハッシュ値“２”に対応する領域は｛Ｃ、Ｆ｝である。
【００５９】
状態“３”から次の状態へ遷移するための文字は、図２よりＣ、Ｄ、Ｅ、Ｆである。そこで、ハッシュ値“０”に対応する領域｛Ａ、Ｄ、Ｇ｝を、文字Ｄとそれ以外の文字の集合とに分割して、｛Ｄ｝と｛Ａ、Ｇ｝の２つの小領域を作成する。同様に、ハッシュ値“１”に対応する領域｛Ｂ、Ｅ｝を、文字Ｅとそれ以外の文字の集合とに分割して、｛Ｅ｝と｛Ｂ｝の２つの小領域を作成する。さらに、ハッシュ値“２”に対応する領域｛Ｃ、Ｆ｝を、文字Ｃ（または文字Ｆでも良い）とそれ以外の文字の集合とに分割して、｛Ｃ｝と｛Ｆ｝の２つの小領域を作成する。
【００６０】
次に、６つの小領域｛Ｄ｝、｛Ａ、Ｇ｝、｛Ｅ｝、｛Ｂ｝、｛Ｃ｝、｛Ｆ｝のそれぞれについて遷移先を求める。図２より、小領域｛Ｃ｝の遷移先は状態“５”に、｛Ｄ｝は状態“６”に、｛Ｅ｝は状態“７”に、｛Ｆ｝は状態“８”に、それぞれ確定する。
【００６１】
小領域｛Ａ、Ｇ｝の遷移先について考える。文字ＡおよびＧについては状態“３”から次の状態へ遷移できないため、失敗遷移を辿ることになる。図２より、状態“３”の失敗遷移先は状態“２”になる。ここで、文字Ａについては、状態“２”から状態“４”へ遷移できる。しかし、文字Ｇについては、状態“２”から次の状態へ遷移できないため、さらに失敗遷移を辿ることになる。従って、状態“２”の次の時点で、小領域｛Ａ、Ｇ｝の遷移先が１通りに定まらなくなる。そのため、小領域｛Ａ、Ｇ｝の遷移先は状態“２”となり、その遷移は不確定として扱われる。
【００６２】
小領域｛Ｂ｝の遷移先について考える。状態“３”から文字Ｂで次の状態へ遷移できないため、失敗遷移を辿って状態“２”に到達するが、状態“２”からも文字Ｂで次の状態へ遷移できないため、さらに失敗遷移を辿って状態“０”に至る。状態“０”からは文字Ｂで状態“２”へ遷移できるため、小領域｛Ｂ｝の遷移先は状態“２”に確定する。
【００６３】
上記から、状態“３”に関して以下の情報が得られる：
ハッシュ関数はｆ３（ｘ）＝ｘ％３である
ハッシュ値“０”に対応する領域の照合文字はＤである
ハッシュ値“１”に対応する領域の照合文字はＥである
ハッシュ値“２”に対応する領域の照合文字はＣである
ハッシュ値“０”に対応する領域については、照合文字の遷移先は状態“６”に確定するが、照合文字以外の文字の遷移先は状態“２”かつ不確定である
ハッシュ値“１”に対応する領域については、照合文字の遷移先は状態“７”に確定し、照合文字以外の文字の遷移先は状態“２”に確定する
ハッシュ値“２”に対応する領域については、照合文字の遷移先は状態“５”に確定し、照合文字以外の文字の遷移先は状態“８”に確定する。
【００６４】
以上の結果をまとめると、図４に示される変形された状態遷移図が得られる。変形された状態遷移図は、Aho-Corasick法に基づいて作成された元の状態遷移図（本例では図２）よりも、失敗遷移の回数を減らすことができ、文字列検索の高速化に寄与する。その理由は、Aho-Corasick法による状態遷移図では状態ごとに１つの失敗遷移しか定めないのに対し、変形された状態遷移図では状態ごとに１つ以上の領域が定義され、各々の領域について失敗遷移の回数が最小になる遷移先が規定されるからである。
【００６５】
変形された状態遷移図を用いることによって失敗遷移の回数が減少することを、具体例を用いて説明する。図２（元の状態遷移図）と図４（変形された状態遷移図）を参照する。状態“３”にいるときに被検索文字としてＢが入力された場合を考える。
【００６６】
図２（元の状態遷移図）では、状態“３”から文字Ｂで次の状態へ遷移できないため、状態“３”の失敗遷移先である状態“２”に移動するが、状態“２”からも文字Ｂで次の状態へ遷移できないため、さらに状態“２”の失敗遷移先である状態“０”
に移動し、ようやく状態“０”から文字Ｂで状態“２”へ遷移できることが分かる。結果的に、失敗遷移が２回繰り返される。
【００６７】
一方、図４（変形された状態遷移図）では、状態“３”において、文字Ｂはハッシュ値“１”に対応する領域｛Ｂ、Ｅ｝に属し、かつ、文字Ｂは照合文字Ｅに一致しないから、文字Ｂの遷移先が状態“２”であることは瞬時に判明する。
【００６８】
図４（変形された状態遷移図）を、状態遷移表の形に書き直すと、図５が得られる。この際、状態“４”、“５”、“６”、“７”、“８”は、次の状態を持たない末端であるため、状態遷移表には記載されない。
【００６９】
図５に示した状態遷移表における、情報の配置方法について説明する。状態遷移表の１つの行に、領域１つに関する情報が格納される。状態遷移表の各行には、上から順に、０から始まるアドレスが振られる。同一の状態から生成された複数の領域は、必ず連続するアドレス空間に配置される。その際、ハッシュ値“０”に対応する領域が最も若いアドレスに配置され、次にハッシュ値“１”に対応する領域が続く。また、状態“０”から生成された領域は、必ずアドレス“０”から順に配置される。
【００７０】
状態遷移表を状態遷移メモリ２３の内容へ変換する手順について述べる。図６は、図５の状態遷移表から変換された状態遷移メモリ２３の内容である。
【００７１】
状態遷移表と同様に、１つの領域に関する情報が状態遷移メモリ２３の１つのアドレスに格納される。また、領域が配置される順序は、状態遷移メモリ２３と状態遷移表で同一である。そのため、状態２００、ハッシュ値２０２、照合文字１２３は、状態遷移メモリ２３と状態遷移表で共通になる。
【００７２】
図６の一致時遷移確定フラグ１２４は、図５の対応する照合文字遷移確定フラグ２０３が確定（丸印で表記）であるとき１になり、不確定（バツ印で表記）であるときに０になる。図６の不一致時遷移確定フラグ１２５は、図５の対応する非照合文字遷移確定フラグ２０５が確定であるとき１になり、不確定であるときに０になる。
【００７３】
図６の一致時次状態アドレス１３０は、図５の対応する照合文字遷移先２０４が指し示す状態の先頭アドレスである。例えば、アドレス“２”の一致時次状態アドレス１３０を求めるには、アドレス“２”の照合文字遷移先２０４を参照して状態“３”を得てから、状態“３”が格納されているアドレスを調べる。状態“３”はアドレス“４”〜“６”に渡って格納されているため、アドレス“２”の一致時次状態アドレス１３０は、それらの先頭の４となる。
【００７４】
ただし、一致時次状態アドレス１３０を求める際に参照される照合文字遷移先２０４の内容が、状態遷移図において次の状態への遷移を持たない状態であるとき、その状態の失敗遷移先が代わりに使用される。さらに、その失敗遷移先も、次の状態への遷移を持たない状態である場合は、その失敗遷移先の失敗遷移先が使用される。以後、同様である。例えば、アドレス“３”の一致時次状態アドレス１３０を求めることを考える。アドレス“３”の照合文字遷移先２０４を参照すると状態“４”を得る。ここで、状態“４”は、図２の状態遷移図において次の状態への遷移を持たない末端であり、その失敗遷移先は状態“１”である。また、状態“１”は、次の状態への遷移を持つ。従って、アドレス“３”の一致時次状態アドレス１３０は、状態“１”が格納されている先頭アドレスになる。状態“１”はアドレス“２”に格納されているから、アドレス“３”の一致時次状態アドレス１３０は、２になる。
【００７５】
図６の一致時ハッシュ関数１２８は、図５の対応する照合文字遷移先２０４が指し示す状態のハッシュ関数２０１に等しい。例えば、アドレス“２”の一致時ハッシュ関数１２８を求めるには、アドレス“２”の照合文字遷移先２０４を参照して状態“３”を得てから、状態“３”のハッシュ関数２０１を取り出す。状態“３”のハッシュ関数２０１はｘ％３であるから、アドレス“２”の一致時ハッシュ関数１２８はｘ％３となる。
【００７６】
一致時ハッシュ関数１２８を求める際に参照される照合文字遷移先２０４の内容が、状態遷移図において次の状態への遷移を持たない状態であるとき、その状態の失敗遷移先が代わりに使用される。この点に関しては、前述の一致時次状態アドレス１３０の場合と同一であるので、その説明を省略する。
【００７７】
図６の一致時パターン番号１２６は、図５の対応する照合文字遷移先２０４が指し示す状態に到達したときに、出力されるパターン番号である。本例では、状態“４”、“５”、“６”、“７”、“８”のいずれかに到達したときに、パターンを検出したことになる。
【００７８】
例として、アドレス“６”の一致時パターン番号１２６を求める。アドレス“６”の照合文字遷移先２０４を参照すると、状態“５”が得られる。図２を参照すると状態“５”はパターン“ＡＢＣ”に対応しており、そのパターンに割り当てられているパターン番号は図３を参照すると、１である。従って、アドレス“６”の一致時パターン番号１２６は、１になる。なお、一致時パターン番号１２６は、対応する一致時遷移確定フラグ１２４が０のときは無効であるので、＊（Don't care）としておく。
【００７９】
図６の不一致時パターン番号１２７、不一致時ハッシュ関数１２９、不一致時次状態アドレス１３１の算出方法は、図５の照合文字遷移先２０４の代わりに非照合文字遷移先２０６を使用することを除けば、それぞれ一致時パターン番号１２６、一致時ハッシュ関数１２８、一致時次状態アドレス１３０の算出方法と同一であるので、それらの説明を省略する。
【００８０】
このように本発明では、文字そのものではなく、文字にハッシュ関数を適用した結果のハッシュ値をインデックスとして状態遷移表を参照し、次の状態を求める。ハッシュ関数を適切に選択することにより、ハッシュ値が取りうる値の範囲を、文字の種類の数よりも小さくできる。例えば、図４（変形後の状態遷移図）の状態“０”のハッシュ値は、０か１の２通りのみであり、文字の種類の数である７（Ａ〜Ｇ）より小さい。従って、全ての状態と全ての文字の組み合わせについて遷移先を規定する従来技術１と比較して、状態遷移表を格納するためのメモリの量を削減できる。
【００８１】
状態遷移表を作成する際に使用されるハッシュ関数の要件について説明する。Σを全ての文字の集合、Ｚを全ての整数の集合とする。着目している状態の番号をｎとする。状態“ｎ”から次の状態へ遷移するための文字の集合をＴｎとする。状態“ｎ”のハッシュ関数をｆｎ（ｘ）とおく。ｆｎ（ｘ）＝ａ、ａ∈Ｚを満たすｘ（ｘ∈Σ）の集合を、Ｇｎ（ａ）とする。関数ｓｉｇｎ（ｘ）を次のように定義する。ｘが負のときｓｉｇｎ（ｘ）＝−１、ｘが０のときｓｉｇｎ（ｘ）＝０、ｘが正のときｓｉｇｎ（ｘ）＝１。Ｓを集合としたとき、｜Ｓ｜はＳの要素数を表し、ＳバーはＳの補集合を表す。∩は積集合、∪は和集合を示す。このとき、ｆｎ（ｘ）が満たすべき条件を、図１２に示す。
【００８２】
例として、図２の状態遷移図の状態“３”の場合、Σ＝｛Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ｝、ｎ＝３、Ｔ３＝｛Ｃ、Ｄ、Ｅ、Ｆ｝、Ｇ３（０）＝｛Ａ、Ｄ、Ｇ｝、Ｇ３（１）＝｛Ｂ、Ｅ｝、Ｇ３（２）＝｛Ｃ、Ｆ｝、それ以外のＧ３（ａ）は空集合であり、ｆ３（ｘ）＝ｘ％３は図１２の条件を満たす。
【００８３】
ハッシュ関数がｆｎ（ｘ）＝ｘ％Ｎ（Ｎは自然数）の形で表されるとき、状態遷移表の大きさを最小にする方法について説明する。
【００８４】
ｆｎ（ｘ）は０から（Ｎ−１）までの範囲をとるから、状態“ｎ”は、状態遷移表においてＮ個のアドレス（行）を占有することになる。従って、図１２の条件を満たしつつ、Ｎが最小になるようなハッシュ関数ｆｎ（ｘ）を選べばよい。Ｎ＜｜Ｔｎ｜÷２のとき、図１２の条件式は成立しないから、Ｎ＝｜Ｔｎ｜÷２から開始し、Ｎを１つずつ増やながら、図１２の条件が満たされるかどうかをチェックする。図１２の条件を初めて満たしたときのｆｎ（ｘ）＝ｘ％Ｎが、状態遷移表の大きさを最小にするハッシュ関数になる。
〔実施の形態の動作〕
図１の文字列検索装置１の動作について、具体例を挙げて詳細に説明する。
【００８５】
本例では、パターンとしてＡＢＣ、ＡＢＤ、ＡＢＥ、ＡＢＦ、ＢＡの５つを使用し、それぞれのパターンに対して図３のようにパターン番号を割り当てる。パターン番号とは、どのパターンが検出されたかを判別するための情報であり、パターンごとに採番される。図２は、これらのパターンから作成された状態遷移図である。図５は、図２の状態遷移図に対し、ハッシュ関数と照合文字による分類を施した後の状態遷移表である。図６は、文字列検索装置１の状態遷移メモリ２３の内容であり、図５の状態遷移表から生成される。
【００８６】
図７は、被検索文字列がＡＢＡＢＧＡＢＦであるときの、文字列検索装置１の各信号のタイムチャートである。また、図８は、文字列検索装置１の動作を示すフローチャートである。以下、図８について説明するが、ステップ１０３以降では、図７のタイムチャートも参照されたい。
【００８７】
図８のフローチャートのステップＳ１００から文字列検索を開始する。
【００８８】
始めに、文字列検索装置１の各信号を初期化する（ステップＳ１００〜Ｓ１０２）。
【００８９】
ステップＳ１００
一致時ハッシュ関数１２８および不一致時ハッシュ関数１２９は、状態遷移表における状態“０”に対応するハッシュ関数２０１に設定される。また、一致時遷移確定フラグ１２４、不一致時遷移確定フラグ１２５、一致時次状態アドレス１３０、不一致時次状態アドレス１３１は、全て０にリセットされる。さらに、被検索文字１０１は、被検索文字列の先頭文字にセットされる。本例では、被検索文字列の先頭文字はＡであるので、被検索文字１０１はＡにセットされる。
【００９０】
ステップＳ１０１
一致時遷移確定フラグ１２４および不一致時遷移確定フラグ１２５は、ともに０であるから、セレクタ２５の出力値は無条件に０になる。一致時ハッシュ関数１２８と不一致時ハッシュ関数１２９は等しいから、セレクタ２７の出力値は無条件に、状態遷移表における状態“０”に対応するハッシュ関数２０１になる。本例では、図５の状態遷移表を参照すると、状態“０”に対応するハッシュ関数２０１はｘ％２であるから、セレクタ２７の出力値はｘ％２になる。一致時次状態アドレス１３０および不一致時次状態アドレス１３１は、ともに０であるから、セレクタ２８の出力値は無条件に０になる。
【００９１】
ステップＳ１０２
セレクタ２５の出力値は０であるので、遷移確定フラグ１０２は０になる。
【００９２】
次に、クロック信号１００に同期しながら、１文字ずつ文字列検索を実施する（ステップＳ１０３〜Ｓ１１５）。
【００９３】
ステップＳ１０３〜Ｓ１０４
クロック信号１００の立ち上がりで、被検索文字レジスタ２０、ハッシュ関数レジスタ２９、次状態アドレスレジスタ３０は、それぞれ、被検索文字１０１、セレクタ２７の出力値、セレクタ２８の出力値をラッチする。本例では、被検索文字レジスタ２０はＡを、ハッシュ関数レジスタ２９はｘ％２を、次状態アドレスレジスタ３０は０をラッチする。
【００９４】
ステップＳ１０５
被検索文字１２０、ハッシュ関数１３３、次状態アドレス１３４は、それぞれ、被検索文字レジスタ２０の出力値、ハッシュ関数レジスタ２９の出力値、次状態アドレスレジスタ３０の出力値に等しい。本例では、被検索文字１２０はＡに、ハッシュ関数１３３はｘ％２に、次状態アドレス１３４は０になる。
【００９５】
ステップＳ１０６
ハッシュ演算器２１において、ハッシュ関数１３３に被検索文字１２０に対応する文字コードが代入されてハッシュ値１２１が算出される。本例では、被検索文字１２０はＡであり、Ａに対応する文字コードは図１０を参照すると０である。また、ハッシュ関数１３３はｘ％２であるから、ハッシュ値１２１は、０（＝０％２）になる。
【００９６】
ステップＳ１０７
ハッシュ値１２１と次状態アドレス１３４は加算器２２によって加算されて、アドレス１２２となる。本例では、ハッシュ値１２１は０、次状態アドレス１３４は０であるから、アドレス１２２は０（＝０＋０）になる。
【００９７】
ステップＳ１０８
状態遷移メモリ２３の中の、アドレス１２２の内容を読み出す。本例では、アドレス１２２は０であるから、状態遷移メモリ２３の中のアドレス“０”の内容が読み出され、照合文字１２３はＡに、一致時遷移確定フラグ１２４は１に、不一致時遷移確定フラグ１２５は１に、一致時パターン番号１２６は０に、不一致時パターン番号１２７は０に、一致時ハッシュ関数１２８はｘ％１に、不一致時ハッシュ関数１２９はｘ％２に、一致時次状態アドレス１３０は２に、不一致時次状態アドレス１３１は０になる。
【００９８】
ステップＳ１０９
比較器２４によって被検索文字１２０と照合文字１２３が比較される。それらが等しければステップＳ１１０へ進み、異なっていればステップＳ１１１へ進む。本例では、被検索文字１２０はＡ、照合文字１２３もＡであるから、ステップＳ１１０へ進む。
【００９９】
ステップＳ１１０（被検索文字１２０と照合文字１２３が等しいとき）
一致フラグ１３２を１にセットする。一致フラグ１３２が１であるから、セレクタ２５〜２８は、それぞれ、一致時遷移確定フラグ１２４、一致時パターン番号１２６、一致時ハッシュ関数１２８、一致時次状態アドレス１３０を選択する。本例では、セレクタ２５の出力値は１に、セレクタ２６の出力値は０に、セレクタ２７の出力値はｘ％１に、セレクタ２８の出力値は２になる。その後、ステップＳ１１２へ進む。
【０１００】
ステップＳ１１１（被検索文字１２０と照合文字１２３が異なっているとき）
一致フラグ１３２を０にリセットする。一致フラグ１３２が０であるから、セレクタ２５〜２８は、それぞれ、不一致時遷移確定フラグ１２５、不一致時パターン番号１２７、不一致時ハッシュ関数１２９、不一致時次状態アドレス１３１を選択する。なお、本例ではステップＳ１１０が選択されたので、このステップは実行されない。
【０１０１】
ステップＳ１１２
遷移確定フラグ１０２はセレクタ２５の出力値に等しい。また、パターン番号１０３はセレクタ２６の出力値に等しい。本例では、遷移確定フラグ１０２は１に、パターン番号１０３は０になる。
【０１０２】
ステップＳ１１３
遷移確定フラグ１０２が１のとき、現在の被検索文字１２０に関する処理は完了しているので、ステップＳ１１４へ進む。遷移確定フラグ１０２が０のとき、その処理は完了していないから、ステップＳ１０３へ戻る。本例では、遷移確定フラグ１０２は１であるので、ステップＳ１１４へ進む。
【０１０３】
ステップＳ１１４
被検索文字列の中の全ての文字について処理が終わったかどうかを判定する。被検索文字１２０が被検索文字列の最終文字であれば、文字列検索を終了する。そうでなければステップＳ１１５へ進む。本例では、被検索文字１２０は被検索文字列の最終文字ではないので、ステップＳ１１５へ進む。
【０１０４】
ステップＳ１１５
被検索文字列の次の文字を被検索文字１０１にセットする。本例では、被検索文字列の２番目の文字であるＢが、被検索文字１０１にセットされる。その後、ステップＳ１０３へ戻る。
【０１０５】
以上、クロック信号１００の１回目の立ち上がり前後の動作について述べたが、クロック信号１００の２〜１１回目の立ち上がり前後についても同様であるので、それらの動作の説明を割愛する。
【０１０６】
検出されたパターンの番号とパターンが検出された位置は、遷移確定フラグ１０２が１であるときのパターン番号１０３によって示される。本例では、遷移確定フラグ１０２が１であるときのパターン番号１０３は、時系列順に００５００００４になる。これの意味するところは、被検索文字列の３文字目においてパターン番号“５”に対応するパターンすなわちＢＡが検出され、被検索文字列の８文字目においてパターン番号“４”に対応するパターンすなわちＡＢＦが検出された、ということである。
【０１０７】
文字列検索時の計算量について考察する。本発明では、ハッシュ関数すなわちハッシュ関数１３３がｘ％Ｎの形状であるとき、１回の状態遷移の際に、１回の剰余算と１回の加算、１回の同値比較、が発生する。
【０１０８】
１回の剰余算は、ハッシュ演算器２１におけるハッシュ値１２１の計算時に実行される。１回の加算は、加算器２２におけるハッシュ値１２１と次状態アドレス１３４の加算である。１回の同値比較は、比較器２４における被検索文字１２０と照合文字１２３との一致判定の際に実行される。
【０１０９】
これら３つの演算の計算量は、文字の種類の数が増えても変化しない。ただし厳密に言えば、文字の種類の数が増加すると、文字を表現するために必要なビット数が拡張されるため、計算量は微増する。しかし、その増加量は、文字の種類の数の増加量に比べれば極めて小さくなる。例えば、文字の種類の数が２５６倍になったとしても、文字を表現するために必要なビット数は８しか増えない（８＝ｌｏｇ２２５６）。
【０１１０】
このように、本発明においては、検索速度は文字の種類の数による影響をほとんど受けない。一方、従来技術２では、前述の通り、文字の種類の数に正比例してビットマップ９２０の参照回数が増加するため、文字の種類の数が多い場合に検索速度が著しく低下してしまう。
【図面の簡単な説明】
【０１１１】
【図１】本発明の実施の形態のブロック図である。
【図２】Aho-Corasick法に基づく状態遷移図の一例を示す図である。
【図３】パターンとパターン番号の一例を示す図である。
【図４】図２の状態遷移図に対してハッシュ値と照合文字による分類を施した後の状態遷移図である。
【図５】図４の状態遷移図から生成された状態遷移表を示す図である。
【図６】図５の状態遷移表が状態遷移メモリ２３に収容された様子を表す図である。
【図７】本発明の実施の形態の動作を説明するためのタイムチャートである。
【図８】本発明の実施の形態の動作を示すフローチャートである。
【図９】本発明の実施の形態の動作を示すフローチャートである。
【図１０】文字と文字コードの対応関係の一例を示す図である。
【図１１】文字にハッシュ関数を適用してハッシュ値を求めた結果の一例を示す図である。
【図１２】ハッシュ関数が満たすべき条件式である。
【図１３】従来の技術における状態遷移表の一例を示す図である。
【図１４】従来の技術における状態遷移表の一例を示す図である。
【符号の説明】
【０１１２】
１…文字列検索装置
２０…被検索文字レジスタ
２１…ハッシュ演算器
２２…加算器
２３…状態遷移メモリ
２４…比較器
２５〜２８…セレクタ
２９…ハッシュ関数レジスタ
３０…次状態アドレスレジスタ
１００…クロック信号
１０１…被検索文字
１０２…遷移確定フラグ
１０３…パターン番号
１２０…被検索文字
１２１…ハッシュ値
１２２…アドレス
１２３…照合文字
１２４…一致時遷移確定フラグ
１２５…不一致時遷移確定フラグ
１２６…一致時パターン番号
１２７…不一致時パターン番号
１２８…一致時ハッシュ関数
１２９…不一致時ハッシュ関数
１３０…一致時次状態アドレス
１３１…不一致時次状態アドレス
１３２…一致フラグ
１３３…ハッシュ関数
１３４…次状態アドレス
２００…状態
２０１…ハッシュ関数
２０２…ハッシュ値
２０３…照合文字遷移確定フラグ
２０４…照合文字遷移先
２０５…非照合文字遷移確定フラグ
２０６…非照合文字遷移先
【図１】
0004810915.tif 000002
【図２】
0004810915.tif 000003
【図３】
0004810915.tif 000004
【図４】
0004810915.tif 000005
【図５】
0004810915.tif 000006
【図６】
0004810915.tif 000007
【図７】
0004810915.tif 000008
【図８】
0004810915.tif 000009
【図９】
0004810915.tif 000010
【図１０】
0004810915.tif 000011
【図１１】
0004810915.tif 000012
【図１２】
0004810915.tif 000013
【図１３】
0004810915.tif 000014
【図１４】
0004810915.tif 000015