ローリングハッシュラビン-カープアルゴリズムで大きなハッシュコード値を処理するにはどうすればよいですか?負の数を避けるためにモジュラー演算を使用していますが、ハッシュコードがモジュロ数(N = 83559671)を超えると問題が発生します。基数を素数(ハッシュコードを計算するための数)とモジュロ数(本当に大きい)に設定しましたが、長い文字列では機能しません。誰かが問題を見ることができますか?
これが私のコードです。
public static void main(String [] args){
int P = 13; // base
long M = 83559671;
long iHash = 0;
String word = "abcbadccaaaabbbb";
int WINDOW = 9;
for(int i = 0; i < WINDOW; i++){
iHash = int_mod(int_mod(iHash*P, M) + word[i], M);
}
for(int i = WINDOW; i < word.length; i++){
iHash = int_mod(iHash - word[i-WINDOW] * get_pow(P, WINDOW-1, M), M);
iHash = int_mod(iHash * P, M);
iHash = int_mod(iHash + word[i], M);
}
}
public static long get_pow(int p, int t, long M){
long a = 1;
for(int i = 0 ; i < t; i++){
a = int_mod(a * p, M);
}
return a;
}
public static long int_mod(long a, long b){
return (a % b+ b) % b;
}
問題は、文字列の長さが8より長い場合、その文字列のハッシュコードがモジュロ数83559671を超え、比較すると間違った答えが返されることです。短い文字列は適切に機能します。