一个128位哈希与两个不同的64位哈希(非加密)?

时间:2014-09-25 19:28:12

标签: hashmap statistics bloom-filter

我目前正在对大约1000亿个项目的数据集实施哈希表。 其中大多数都是重复的(大约75%)所以“唯一”值的集合要小一些。

我知道我无法避免100%的碰撞,但我想让它们至少不太可能。 这个想法是针对两个不同的散列函数进行测试,假设如果一个散列碰撞另一个散列可能不会。请参阅:bloom-filter。

我现在的问题是 - 在统计上与仅使用两倍大小的单个哈希相同吗? 那么让我们说Murmur3 128而不是Murmur3 64 + CityHash 64?

1 个答案:

答案 0 :(得分:1)

如果它们具有非常出色的散列函数,则碰撞概率应该相同。在实践中,我怀疑单独的哈希函数会表现得更好。

Bloom过滤器是一种通过将哈希集BITOR一起来节省内存的一种聪明的方法,以牺牲一些冲突概率。从理论上讲,可以使用两个64位哈希与128位哈希的两半进行相同的工作。你可能没有足够的RAM用于2 128 位,因此将它分成(或使用单独的)4个32位哈希并将它们叠加到Bloom中是切实可行的过滤器包含2 32 位= 2 29 bytes = 1/2 GB。

具有出色的64位散列函数[我避免使用术语"完美散列函数"因为它具有特定含义],两个条目意外碰撞的概率是2 -64 ,这是一个非常小的数字。

如果你有100G的独特物品,你需要100G 2 = 10 22 或约2 73 哈希值,或者73个哈希位,用于获得 no 冲突降至1/2的概率。