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

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

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

这是随机散列的有效实现,还是有更常见/可接受的方式来实现它?

这篇文章提出了类似的问题,但我仍然对答案的措辞感到困惑: Minhash实现如何找到排列的哈希函数

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

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

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

i从1到k (你想要的散列函数的数量)变化。

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

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

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