Java 创建独立的散列函数

Java 创建独立的散列函数,java,data-structures,hash,bloom-filter,Java,Data Structures,Hash,Bloom Filter,我需要创建两个独立的散列函数来实现java中的bloom过滤器 这两个散列函数h_1(x)和h_2(x)将在需要时用于模拟其他散列函数 我了解如何创建如下基本哈希函数: 哈希函数h(x)=x mod M,其中M表示哈希表大小,是一个素数 给定一个包含字符c_i: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 这样,以不同顺序包含相同字符的字符串将不会散列为相同

我需要创建两个独立的散列函数来实现java中的bloom过滤器

这两个散列函数h_1(x)和h_2(x)将在需要时用于模拟其他散列函数

我了解如何创建如下基本哈希函数:

哈希函数h(x)=x mod M,其中M表示哈希表大小,是一个素数

给定一个包含字符c_i: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

如何创建独立于此散列函数的第二个散列函数

改变常数就足够了吗


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

快速bloom筛选器实现通常不使用两个完全独立的哈希函数。相反,它使用一个好的散列函数返回足够的位,并从中创建多个散列值。例如:使用3哈希创建128位哈希值。由此,使用较低的64位和较高的64位,如下所示:

h(x) = (higher + x * lower) mod M
这就是当前的工作方式

M
在实践中不一定需要是素数,即使它不会造成伤害。(理论上,应该是一个。)

对于缩减步骤:
mod M
可以替换为一个


哈希函数使用
128^n
。使用众所周知的散列函数(如Murruld 3)可能更好。

我认为这里的“独立”意味着一个不调用另一个。你能解释一下“独立”是什么意思吗?为了给出一个简单的答案,可以使用@displayName中的任意两个哈希函数。我在Reddit上问了同样的问题,有人告诉我函数在定义上是独立的。如果这是正确的,我认为它只意味着两个不同的哈希函数,在这种情况下,你的命题似乎是正确的。请参阅。当我使用Bloom过滤器时,该技术非常有效。请创建一个问题的解决方案,以便其他人能够最好地帮助您。