ハッシュは文字列の検索にも使えます。ローリングハッシュは文字列A(m文字)から、互いに素な基数bとmodの除数hを用いて以下の式でハッシュ値を求めます。

hash(A) = ( A_0*b^(m-1) + A_1*b^(m-2) + … + A_(m-1)*b^0 ) mod h

ハッシュ値が一致する場合は高確率で同じ文字列なのである文字列のなかに探している文字列があるかどうかを調べることができます。

ローリングハッシュで計算量を減らすには?

m文字の文字列のハッシュ値の計算にはO(m)がかかります。なので普通の方法で計算していると時間がかかります。しかし合同式の性質を使うと計算量を減らすことができます。

まず文字列の1文字目からn文字目までのハッシュ値を求めてしまいましょう。

1文字目は文字コード×Bの0乗(=1)なので文字コードと同じになります。2文字目以降のハッシュ値は先に求めた(n-1)文字目までの文字列のハッシュ値にBを掛けて文字コードを足したものをmodで割った剰余となります。

1文字目からn文字目までのハッシュ値がわかれば、これをつかってa文字目からb文字分の文字列のハッシュも求めることができます。

これは検索しようとしている文字列のハッシュ値を取得するメソッドです。同時に複数の文字列の検索をする場合、PowModメソッドが一度取得した値を辞書に記録してすぐに取得できるようにしました。

あとはMainメソッド内でこれらを呼び出します。

実行結果

JavaScriptで実装する

JavaScriptでも実装してみることにします。

定数を示します。

index.js

ハッシュテーブルを生成する処理を示します。

ハッシュテーブルからハッシュを求める処理を示します。

ボタンがクリックされたら検索をおこないます。