获得的k明智独立散列函数(Obtaining a k-wise independent hash f

2019-09-01 10:09发布

我需要使用属于一个家庭的K-两相互独立的哈希函数的哈希函数。 在C,C ++的任何文库或工具包或蟒其可以产生一组k个两相互独立的散列函数从我可以选择一个功能的任何指针。

背景:我想实现这个算法在这里: http://researcher.watson.ibm.com/researcher/files/us-dpwoodru/knw10b.pdf对不同元素的问题。

我已经看过这个线程: 产生k两两独立的散列函数 ,其中提到使用杂音哈希生成成对独立的哈希函数。 我在想,如果有什么是K-两相互独立的哈希函数类似。 如果没有提供,将有可能对我来说,建设这样一组K-两相互独立的哈希函数。

提前致谢。

Answer 1:

这是众多解决方案之一,但你可以使用例如下面的开源散列算法: http://code.google.com/p/xxhash/

然后,以产生不同的哈希值,你只需要提供不同的种子。

考虑到主要功能的声明:无符号整型XXH32(常量无效*输入,INT LEN,无符号整型种子);

所以,如果你需要k个不同的哈希值,只需重新使用相同的算法k次,其中k不同的种子。



Answer 2:

最简单的K-明智独立散列函数(映射正整数x < p至之一m桶)是刚

其中p是一些大的随机引(2 61 -1将工作)和i为小于一些随机的正整数p ,0> 0。

2两相互独立的散列: h(x) = (ax + b) % p % m

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

这些公式定义的散列函数的家庭。 他们的工作(理论上),如果从对应的家人选择一个哈希函数随机(也就是说,如果你随机生成a年代和b )每次运行你的算法。



Answer 3:

有作为“K-两相互独立的哈希函数”没有这样的事。 不过,也有功能的K-明智独立的家庭

作为提醒,的功能的家庭为k两相互独立时,如果h被从家庭随机挑选X_1 .. X_K和Y_1 .. Y_K可任意选择,所述概率“对于所有的i,H(X_I)= Y_I “是Y 1 -k,其中Y是从其中选择的Y_I共域的大小。

还有的是被称为是K-明智独立于小k如2,3,4,5了k功能的几户人家,你可能会需要使用多项式散列。 请注意,有这两个变种,其中一个甚至不是2无关,因此实施时要小心。

多项式散列家族可以从场F,使用的常数K A_0通过A_ {K-1},并且通过A_I的x ^ i,其中x是您正在散列密钥的总和定义的散列到自身。 现场算术可以在电脑上通过采取让F为整数模素数p来实现。 这可能不太方便,因为它往往是最好有域和范围uint32_t等。 在这种情况下可以使用字段F_ {2 ^ 32},并且可以通过在该领域中的不可约多项式使用过Z_2多项式乘法,然后除以。 否则,可以在操作Z_p其中p为大于2 ^ 32(或64)放大,并采取多项式模2 ^ 32的结果,我想。 这只会是几乎K-明智独立的,但有时这是足以让分析开去。 这不会是容易重新分析KNW算法改变其哈希家庭。

要生成一个k明智独立的家族中的一员,用自己喜欢的随机数发生器挑函数随机。 在polynomila散列的情况下,这意味着挑选a S上方引用。 /dev/random应该足够了。

你点到的论文“一种优化算法不同元素的问题”,是一个很好的一个,并已被引用多次。 然而,这并不容易实现,而且可能会比较慢,甚至会更多的空间比HyperLogLog,由于在大O符号隐藏常数。 许多论文已经注意到了这个算法的复杂度,甚至把它称为不可行相比HyperLogLog。 如果要实现对不同元素的数量的估计,你可能会较早启动算法。 有很多复杂的那里,如果你的目标是教育。 如果你的目标是实用,你也想远离KNW了,因为它可能是一个大量的工作,只是为了让东西少实用的HyperLogLog。

作为另一条建议,你应该忽视的建议“只是用杂音哈希”或“从xxhash挑选的k值”,如果你想了解和理解这种算法或其他随机算法使用散列。 杂音/ XX可能是在实践中很好,但他们没有K-明智独立的家庭,以及一些此页面上的建议是,甚至没有语义良好的。 例如,“如果你需要k个不同的哈希值,只需重新使用相同的算法k次,其中k不同的种子”是不相关的K-明智独立的家庭。 对于这个算法要实现,你最终将哈希函数的任意次数。 你不“需要k个不同哈希”,则需要首先从K-独立的哈希家庭随机挑选和第二应用所选择的功能,流媒体键是输入到这样的算法生成n个不同的哈希值。



Answer 4:

只需使用一个良好的非加密散列函数。 这个建议也许会令我记恨我的理论计算机科学的同事,但是考虑你的对手。

  1. 性质。 是的,也许它会击中极小部分的投入,导致你的散列函数来表现不好,但也有很多其他的方法的东西出问题,一个K-两相互独立的哈希家人不会修复(例如,随机数发生器,选择了哈希函数没做好,臭虫等),所以你需要无论如何测试终端到终端。

  2. 不经意的对手。 这是理论假设什么。 不经意对手不能看看你的随机位。 如果只有他们是如此美好在现实生活中!

  3. 非无视对手。 随机性是毫无意义的。 使用二叉树。



Answer 5:

我不是100%肯定你的“K两相互独立的哈希函数”的意思,但你可以想出两个哈希函数,然后利用它们的线性组合得到k个不同哈希函数。

我有我的布隆过滤器模块中的一个例子: http://stromberg.dnsalias.org/svn/bloom-filter/trunk/bloom_filter_mod.py忽略get_bitno_seed_rnd功能,看HASH1,HASH2和get_bitno_lin_comb



文章来源: Obtaining a k-wise independent hash function