おそらく最も簡単なアプローチは、いくつかの暗号化ハッシュ関数をとり、さまざまなバイトシーケンスで「シード」することです。ほとんどの実用的な目的のために、結果は独立しているべきです。これは、暗号化ハッシュ関数が持つべき重要なプロパティの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
}
編集:は 私はカウントミンスケッチの正確な要件を知らない、機能は十分であるかもしれないシンプルがありますが、それは最も簡単な解決策ではないようです。
私は暗号ハッシュ関数を提案しました。なぜなら、生成されたハッシュ関数は非常に強固であり、実装が簡単で、標準ライブラリを使用することが非常に強いからです。一方
、フォームf1(x) = ax + b (mod p)
とf2(x) = cx + d (mod p)
の2つのハッシュ関数を持っている場合は、あなたが使用して1を計算することができ、他の彼らは非常に独立していないことを示唆している単純な線形式f2(x) = c/a * (f1(x) - b) + d (mod p)
を使用して、(x
を知らなくても) 。だからここで予期せぬ問題に遭遇する可能性がある。
MD5は暗号化されています。 MurmurHashは良いですが、暗号的に強くはありません。 –