我需要创建两个独立的哈希函数以在Java中实现Bloom过滤器。
这两个哈希函数h_1(x)和h_2(x)将在需要时用于模拟其他哈希函数。
我了解如何创建这样的基本哈希函数:
哈希函数h(x)= x mod M,其中M代表哈希表大小,并且是质数。
给出一个包含字符c_i的字符串x:x <-> c_1,c_2,...,c_n,x = c_1.c_2.c_3 ... c_n(。用于串联)
每个字符都将转换为ASCII码E {0,..,127},然后为每个字符乘以一个不同的常量,此处为128 ^ n-1至128 ^ 0。
这样,以相同顺序包含相同字符的字符串将不会散列为相同值。
x = c_1 * 128 ^ n-1 + c_2 * 128 ^ n-2 + ... + c_n * 128 ^ 0
如何创建独立于该哈希函数的第二个哈希函数?
更改常数是否足够?
我如何验证它们确实是独立的?
答案 0 :(得分:1)
快速Bloom过滤器实现通常不使用两个完全独立的哈希函数。相反,它使用一个好的哈希函数返回足够的位,并从中创建多个哈希值。例如:使用Murmur3哈希创建一个128位哈希值。从这开始,使用低64位和高64位,如下所示:
h(x) = (higher + x * lower) mod M
Google Guava Bloom filter implementation当前的工作方式。
实际上, M
不一定是素数,甚至认为它也没有害处。 (理论上应该是一个。)
关于缩减步骤:mod M
可以替换为multiply and shift。
您的哈希函数使用128^n
。使用众所周知的哈希函数(例如Murmur 3)可能要好得多。