获得k-wise独立散列函数

时间:2013-04-29 17:05:54

标签: algorithm hash hash-function

我需要使用属于k-wise独立散列函数族的散列函数。 C,C ++或python中任何库或工具包上的任何指针都可以生成一组k-wise独立的散列函数,我可以从中选择一个函数。

背景:我正在尝试在此处实现此算法:http://researcher.watson.ibm.com/researcher/files/us-dpwoodru/knw10b.pdf用于Distinct Elements问题。

我看过这个帖子:Generating k pairwise independent hash functions,提到使用Murmur哈希来生成成对独立的哈希函数。我想知道是否有类似的k-wise独立散列函数。如果没有可用的话,我是否可以构造一组k-wise独立的散列函数。

提前致谢。

5 个答案:

答案 0 :(得分:4)

最简单的k-wise独立散列函数(将正整数x < p映射到m个桶中的一个)只是

h

其中p是一个大的随机素数(2 61 -1将起作用) 并且 i 是一些小于p的随机正整数, 0 &gt; 0

2-wise独立散列: h(x) = (ax + b) % p % m

再次,p为素数,a > 0a,b < p(即a不能为零,但b可以是随机选择)

这些公式定义了散列函数的族。如果您在每次运行算法时从相应的族中随机选择哈希函数(即,如果您生成随机ab),它们(理论上)就可以工作。

答案 1 :(得分:3)

这是众多解决方案中的一种,但您可以使用以下开源哈希算法: http://code.google.com/p/xxhash/

然后,要生成不同的哈希值,您只需提供不同的种子。

考虑主要功能声明: unsigned int XXH32(const void * input,int len,unsigned int seed);

因此,如果您需要k个不同的哈希值,只需重复使用相同的算法k次,使用不同的种子。

答案 2 :(得分:2)

没有&#34; k-wise独立散列函数&#34;。但是,有k个独立的 系列 函数。

提醒一下,如果h是从家庭中随机挑选的,并且x_1 .. x_k和y_1 .. y_k被任意挑选,那么一系列函数是k-独立的,对于所有i,概率为&#34; h(x_i)= y_i&#34;是Y ^ -k,其中Y是从中选择y_i的共域的大小。

有一些函数族已知是k-wise独立的小k,如2,3,4和5.对于任意k,你可能需要使用多项式散列。请注意,有两种变体,其中一种甚至不是2独立的,因此在实现时要小心。

多项式散列族可以使用k常数a_0到a_ {k-1}从字段F散列到自身,并且由a_i x ^ i之和定义,其中x是要散列的键。通过将F设为以素数p为模的整数,可以在计算机上实现场算术。这可能不方便,因为域和范围通常更好uint32_t等。在这种情况下,您可以使用字段F_ {2 ^ 32},并且可以使用Z_2上的多项式乘法,然后通过该字段中的不可约多项式进行除法。否则,你可以在Z_p中操作,其中p大于2 ^ 32(或64),并且我认为取多项式mod 2 ^ 32的结果。这只是几乎是k-独立的,但有时这足以让分析通过。重新分析KNW算法来改变其散列族是不容易的。

要生成k-wise独立族的成员,请使用您最喜欢的随机数生成器随机选择该函数。在多项式散列的情况下,这意味着选择上面引用的a/dev/random就足够了。

你指出的论文,&#34;一个不同元素问题的优化算法&#34;,是一个很好的,并且已被多次引用。但是,它实现起来并不容易,并且由于big-O表示法中隐藏的常量,它可能比HyperLogLog更慢或甚至占用更多空间。许多论文都指出了这种算法的复杂性,甚至称其与HyperLogLog相比也是不可行的。如果要为不同元素的数量实现估算器,可以从早期的算法开始。如果你的目标是教育,那里有很多复杂性。如果您的目标是实用性,那么您也希望远离KNW,因为为了使HyperLogLog不那么实用,可能需要做很多工作。

作为另一条建议,你应该忽略对#34的建议;只需使用Murmur hash&#34;或者&#34;从xxhash中选择k值&#34;如果您想了解并理解此算法或其他使用散列的随机算法。 Murmur / xx在实践中可能没什么问题,但它们不是k-wise独立的家族,而且这个页面上的一些建议甚至在语义上都不是很好。例如,&#34;如果你需要k个不同的哈希,只需重复使用相同的算法k次,使用k个不同的种子&#34;与k-独立的家庭没有关系。对于您想要实现的算法,您将最终应用哈希函数任意次数。你不需要k不同的哈希值,你需要 n 通过首先从k独立的哈希家族中随机选择产生的不同哈希值第二个将所选择的函数应用于作为此类算法输入的流式密钥。

答案 3 :(得分:0)

只需使用一个好的非加密哈希函数。这个建议或许会让我对理论计算机科学的同事不感兴趣,但请考虑你的对手。

  1. 性质。是的,也许它会击中导致你的哈希函数表现不佳的微小分数输入,但还有很多其他方法可以解决k-wise独立哈希族不能修复的问题(例如,随机数)选择散列函数的生成器没有做好,错误等等,所以无论如何都需要端到端测试。

  2. 不知情的对手。这就是理论假设的。不知情的对手无法看到你的随机位。如果只是他们在现实生活中如此美好!

  3. 非遗忘对手。随机性毫无意义。使用二叉树。

答案 4 :(得分:-1)

我不是100%确定“k-wise独立散列函数”是什么意思,但你可以通过提出两个散列函数,然后使用它们的线性组合来获得k个不同的散列函数。

我的bloom过滤器模块中有一个示例:http://stromberg.dnsalias.org/svn/bloom-filter/trunk/bloom_filter_mod.py忽略get_bitno_seed_rnd函数,查看hash1,hash2和get_bitno_lin_comb

相关问题