【问题标题】:what are the options for obtaining k pair-wise independent hash functions that are fast获得快速的 k 成对独立哈希函数的选项是什么
【发布时间】:2013-12-26 02:24:17
【问题描述】:

我遇到了 k 对独立散列函数的需求,每个散列函数都以一个整数作为输入,并产生一个 0-N 范围内的散列值。 count-min sketch 需要这个,类似于 Bloom 过滤器。

形式上,我需要 h_1,h_2, ..., h_k 散列函数,成对独立。

(h_i(n) mod N ) 将给出 n 在 0-N 范围内的哈希值。由于我正在处理大量数据,因此散列需要具有时间效率。同时,它们应尽可能成对独立。

到目前为止我所尝试的:

1) xxhash:效率高,但在成对独立方面不好,这意味着哈希函数之间存在哈希冲突(意味着 h1(n1)=h1(n2) 然后一些 h_k(n1) 也= h_k(n2)) ,因此我得到的结果很糟糕。

2) 同理,著名的整数散列法((a*n+b) mod p) mod N 也存在与xxhash相同的问题。我相信这被称为通用哈希

3) count-min-sketch 中引入的另一个产生了相当不错的结果,但是对于大量输入来说需要太多时间。

4) 还尝试了 Murmur3、sha1 在碰撞中遇到类似问题。

任何想法将不胜感激。首选 C/C++,但 Java 也可以,或者只是算法。 谢谢

【问题讨论】:

  • 听起来你正在尝试制作一个布隆过滤器......
  • 几乎完全一样。这是 count-min 草图,一种改进的布隆过滤器算法。
  • @simo 你的数据集是什么(是整数,字符串等)
  • 你确定整数哈希吗? people.csail.mit.edu/ronitt/COURSE/S12/handouts/lec5.pdf 的第 2.3 节权利要求 5 是基于模块化算法的证明,证明这种散列函数是成对独立的 - 或者您可能用这个术语表示其他意思?
  • 如果您需要多个函数一起独立,请尝试使用不同的素数 - 根据中国剩余定理,连接的结果应该形成一个大的成对独立哈希函数。

标签: java c++ algorithm hash bloom-filter


【解决方案1】:

我怀疑您对方法 2 的问题是您扔掉了相关的 a_i 和 b_i。
在大领域(接近 2^64)工作,对于初学者来说,确保所有 a_i 和 b_i 都是不同的(即,你得到 2*k 个不同的数字)。如果它们均匀分布在场内,这也不会受到伤害:)

您可能会在使用 SHA 的方法 4 中遇到同样的问题。大多数加密哈希函数(甚至包括损坏的和旧的)对于数据结构的需求已经绰绰有余,无论是任何合理 k 的 k 方向独立性,还是几乎任何其他属性。
我会重新检查 - 你是如何使用它的?

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2012-11-25
    • 1970-01-01
    • 2012-08-20
    • 2013-08-22
    • 2013-08-26
    • 2013-09-12
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多