我遇到了k对独立散列函数的需求,每个函数都将整数作为输入,并产生0-N范围内的散列值。需要这个用于count-min草图,类似于布隆过滤器。
形式上,我需要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相同的问题。我相信这叫做Universal Hashing
3)在count-min-sketch中引入的另一个产生了相当好的结果,但是为大量输入花费了太多时间。
4)还尝试了Murmur3,sha1在碰撞中遇到类似问题。任何想法都会非常感激。 C / C ++首选,但Java也可以,或者只是算法。 感谢
答案 0 :(得分:1)
我怀疑你方法2的问题是你扔了相关的a_i和b_i。
在大场(大约2 ^ 64附近)工作,并且对于初学者来说确保所有a_i和b_i都不同(即,你得到2 * k个不同的数字)。如果它们在场内均匀分布,这也不会伤害:)
您可能在使用SHA的方法4中遇到了同样的问题。大多数加密哈希函数(包括破坏的和旧的哈希函数)对于数据结构的需求来说已经足够了,对于任何合理的k或几乎任何其他属性来说都是k-wise独立。
我会重新检查 - 你是如何使用它的?