ユニバーサル ハッシュ関数をお勧めします。この種の関数は、たとえデータが敵によって選択されたとしても、予想される少数の衝突を保証します。ユニバーサルハッシュ関数はたくさんあります。
文字列の場合は、次のハッシュ関数を採用できます。
文字cに対して#(c) cの算術値ie(ASCII)を定義します。x=c1c1...cn
定義する文字列の場合
HSizeが整数でkが大きな素数 (ユーザーが定義) の場合、範囲 のハッシュ関数は次のようになります。0<a,b<k*HSize
この関数は、[0, HSize-1]
出力値は、ホーナーの法則によって計算され、各演算の後に除算のモジュロが求められk*HSize
ます。
したがって、関数HashFunctionを作成し、ハッシュする文字列をパラメーターとして渡します。コードは次のとおりです。
#define k 7919
#define Hsize 1009
#define a 321
#define b 43112
long long HashFunction(string text)
{
int i;
long long res = 0;
long long M = (Hsize * k);
cout<<"M = "<<M<<endl;
cout<<"Hsize = "<<Hsize<<endl;
cout<<"k = "<<k<<endl;
int s=text.size();
for(i = s-1; i >= 0; i--)
{
res = a * (res * 256 + (int)text[i]);
//cout<<"res before modulo = "<<res<<endl;
res=res % M;
//cout<<"res after modulo = "<<res<<endl;
}
long long res1 = (res + b) / k;
return res1;
}