为LSH Minhash算法生成随机哈希函数

时间:2014-07-10 12:11:20

标签: java algorithm hash locality-sensitive-hash minhash

我正在用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

2 个答案:

答案 0 :(得分:6)

几年前,当我使用Bloom过滤器时,我遇到了一篇文章,该文章描述了如何使用最少的代码非常简单地生成多个哈希函数。他描述的方法非常有效。请参阅Less Hashing, Same Performance: Building a Better Bloom Filter

基本思想是创建两个哈希函数,称之为h1h2,然后使用它们可以模拟多个哈希函数g1gk,使用公式:

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

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

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

答案 1 :(得分:0)

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

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