おそらく最も簡単な方法は、いくつかの暗号化ハッシュ関数を使用して、さまざまなバイト シーケンスを「シード」することです。ほとんどの実用的な目的では、結果は独立している必要があります。これは、暗号化ハッシュ関数が持つべき重要なプロパティの 1 つであるためです (メッセージの一部を置き換えると、ハッシュは完全に異なるはずです)。
私は次のようなことをします:
// for each 0 <= i < k generate a sequence of random numbers
val randomSeeds: Array[Array[Byte]] = ... ; // initialize by random sequences
def hash(i: Int, value: Array[Byte]): Array[Byte] = {
val dg = java.security.MessageDigest.getInstance("SHA-1");
// "seed" the digest by a random value based on the index
dg.update(randomSeeds(i));
return dg.digest(value);
// if you need integer hash values, just take 4 bytes
// of the result and convert them to an int
}
編集:
Count-Min Sketch の正確な要件はわかりません。単純な has 関数で十分かもしれませんが、最も単純なソリューションではないようです。
結果のハッシュ関数が非常に異なるという非常に強力な保証があり、標準ライブラリを使用するだけで簡単に実装できるため、暗号化ハッシュ関数を提案しました。
一方、 と の形式の 2 つのハッシュ関数がある場合f1(x) = ax + b (mod p)
、単純な線形公式 を使用してf2(x) = cx + d (mod p)
( を知らなくても) 別のハッシュ関数を使用して一方を計算できます。これは、それらがあまり独立していないことを示唆しています。そのため、ここで予期しない問題が発生する可能性があります。x
f2(x) = c / a * (f1(x) - b) + d (mod p)