创建独立的哈希函数

时间:2018-07-22 01:09:32

标签: java data-structures hash bloom-filter

我需要创建两个独立的哈希函数以在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

如何创建独立于该哈希函数的第二个哈希函数?

更改常数是否足够?

我如何验证它们确实是独立的?

1 个答案:

答案 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)可能要好得多。