3

我正在用 Java 编写一个 minhashing 算法,它要求我生成任意数量的随机散列函数(在我的例子中为 240 个散列函数),并通过它运行任意数量的整数(目前为 2000 个)。

为了做到这一点,我一直在为 240 个散列函数中的每一个生成随机数 a、b 和 c(范围从 1 到 2001)。然后,我的哈希函数返回 h = ((a*x) + b) % c,其中 h 是返回值,x 是通过它的整数之一。

这是随机散列的有效实现,还是有更常见/可接受的方法来做到这一点?

这篇文章问了一个类似的问题,但我仍然对答案的措辞感到有些困惑: Minhash implementation how to find hash functions for permutations

4

2 回答 2

7

几年前,当我使用 Bloom 过滤器时,我遇到了一篇文章,该文章描述了如何非常简单地生成多个哈希函数,并且使用最少的代码。他描述的方法非常有效。查看更少的哈希,相同的性能:构建更好的布隆过滤器

基本思想是创建两个散列函数,调用它们h1h2,然后您可以使用以下公式g1通过模拟多个散列函数:gk

gi = h1(x) + i*h2(x)

i从 1 到k(您想要的散列函数的数量)不等。

这篇论文非常值得一读,即使你决定不实施他的想法。虽然读完之后我无法想象不想实现它。它使我的 Bloom 过滤器代码更易于处理,并且不会对性能产生负面影响。

于 2014-07-10T20:27:58.833 回答
0

所以我上面描述的方法几乎是正确的。数字 a 和 b 应该是随机生成的。但是,c 需要是一个比 x 的最大可能值稍大的素数。一旦选择了这些数字,使用 h = ((a*x)+b) % c 查找哈希值 h 是生成哈希函数的标准、公认的方法。

此外,a 和 b 应该是 1 到 c-1 范围内的随机数。

于 2014-07-10T14:02:23.593 回答