【问题标题】:Generating Random Hash Functions for LSH Minhash Algorithm为 LSH Minhash 算法生成随机散列函数
【发布时间】:2014-07-10 12:11:20
【问题描述】:

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

【问题讨论】:

  • 计算机从来都不是随机的。他们是Pseudorandom。这听起来像是一个学术问题,因此可能值得注意其中的区别。
  • 还可以尝试bottom-k 散列,您只使用一个散列函数,但保留k 的最小值,而不是只使用一个。

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


【解决方案1】:

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

基本思想是创建两个散列函数,分别命名为h1h2,然后您可以使用以下公式模拟多个散列函数g1gk

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 2018-09-12
      • 1970-01-01
      • 2010-09-24
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多