我正在用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
最佳答案
几年前,当我使用Bloom过滤器时,遇到了一篇文章,描述了如何使用最少的代码非常简单地生成多个哈希函数。他描述的方法效果很好。参见Less Hashing, Same Performance: Building a Better Bloom Filter。
基本思想是创建两个哈希函数,分别命名为h1
和h2
,然后您可以使用以下公式模拟多个哈希函数,即g1
到gk
:
gi = h1(x) + i*h2(x)
i
从1到k
(所需的哈希函数数)不等。即使您决定不执行他的想法,该论文也很值得阅读。尽管阅读完之后我无法想象不想实现它。它使我的Bloom过滤器代码更易于处理,并且对性能没有负面影响。