我正在用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
答案 0 :(得分:6)
几年前,当我使用Bloom过滤器时,我遇到了一篇文章,该文章描述了如何使用最少的代码非常简单地生成多个哈希函数。他描述的方法非常有效。请参阅Less Hashing, Same Performance: Building a Better Bloom Filter。
基本思想是创建两个哈希函数,称之为h1
和h2
,然后使用它们可以模拟多个哈希函数g1
到gk
,使用公式:
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范围内的随机数。