Java 获得快速的k个成对独立散列函数的选项有哪些

Java 获得快速的k个成对独立散列函数的选项有哪些,java,c++,algorithm,hash,bloom-filter,Java,C++,Algorithm,Hash,Bloom Filter,我遇到了k个成对独立散列函数的需求,每个函数都以一个整数作为输入,并生成一个0-N范围内的散列值。count min sketch需要这个函数,它类似于Bloom filter 形式上,我需要h_1,h_2,…,h_k散列函数,成对独立 (h_i(n)mod n)将给出0-n范围内的n的散列值。散列需要具有时间效率,因为我正在处理大量数据。同时,它们应该尽可能成对独立 到目前为止,我所尝试的: 1) xxhash:它是有效的,但在成对独立方面并不好,这意味着hash函数之间存在哈希冲突(意味着h

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

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

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

到目前为止,我所尝试的:

1) xxhash:它是有效的,但在成对独立方面并不好,这意味着hash函数之间存在哈希冲突(意味着h1(n1)=h1(n2),然后一些huk(n1)也=huk(n2)),因此我得到的结果不好

2) 类似地,著名的整数散列方法((a*n+b)mod p)mod n也有与xxhash相同的问题。我相信这就是所谓的通用哈希

3) count min sketch中引入的另一种方法产生了非常好的结果,但对于大量输入来说需要花费太多的时间

4) 在碰撞中也尝试了类似的问题

任何想法都将不胜感激。首选C/C++语言,但也可以使用Java语言,或者只是简单的算法。
谢谢

我怀疑你使用方法2的问题在于你抛出了相关的a_I和b_I。
在大范围内工作(大约2^64),首先要确保所有a_i和b_i是不同的(即,你得到2*k个不同的数字)。如果它们均匀地分布在磁场中,这也不会造成伤害:)

您可能会在方法4中遇到与SHA相同的问题。大多数加密散列函数(甚至包括已损坏和较旧的散列函数)对于数据结构的需要来说已经足够了,无论是对于任何合理的k,还是几乎任何其他属性,都是k-wise独立的。

我会重新检查-您是如何使用它的?

我怀疑您使用方法2的问题在于您抛出了相关的a_I和b_I。
在大范围内工作(大约2^64),首先要确保所有a_i和b_i是不同的(即,你得到2*k个不同的数字)。如果它们均匀地分布在磁场中,这也不会造成伤害:)

您可能会在方法4中遇到与SHA相同的问题。大多数加密散列函数(甚至包括已损坏和较旧的散列函数)对于数据结构的需要来说已经足够了,无论是对于任何合理的k,还是几乎任何其他属性,都是k-wise独立的。

我会再检查一下-你是如何使用它的?

听起来你想做一个布卢姆过滤器……几乎完全正确。这是count min sketch,是bloom filter的一种改进算法。@simo您的数据集是什么(是整数、字符串等)您确定整数散列吗?权利要求5的第2.3节是一个基于模运算的证明,这种散列函数是成对独立的——或者你的意思可能是这个术语的其他意思?如果你需要多个函数组合在一起独立,尝试使用不同的素数——根据中国剩余定理,串联的结果应该形成一个大的结果成对独立的散列函数。听起来像是你在尝试制作一个Bloom过滤器……几乎完全正确。这是count min sketch,是bloom filter的一种改进算法。@simo您的数据集是什么(是整数、字符串等)您确定整数散列吗?权利要求5的第2.3节是一个基于模运算的证明,这种散列函数是成对独立的——或者你的意思可能是这个术语的其他意思?如果你需要多个函数组合在一起独立,尝试使用不同的素数——根据中国剩余定理,串联的结果应该形成一个大的结果成对独立散列函数。