可能最简单的方法是采用一些加密哈希函数并用不同的字节序列“播种”它。对于大多数实际目的,结果应该是独立的,因为这是加密散列函数应该具有的关键属性之一(如果替换消息的任何部分,散列应该完全不同)。
我会做类似的事情:
// 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 函数就足够了,但它似乎不是最简单的解决方案。
我建议使用加密散列函数,因为你有很强的保证,生成的散列函数会非常不同,而且很容易实现,只需使用标准库即可。
另一方面,如果您有两个形式为f1(x) = ax + b (mod p)
和的散列函数,那么您可以使用一个简单的线性公式f2(x) = cx + d (mod p)
(在不知道的情况下)使用另一个哈希函数来计算一个,这表明它们不是很独立。所以你可能会在这里遇到意想不到的问题。x
f2(x) = c / a * (f1(x) - b) + d (mod p)