【发布时间】: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