2014-09-25 71 views
1

我目前正在实施一个包含大约100亿项数据集的哈希表。 其中大部分是重复的(约75%),所以“唯一”值的集合稍小一些。一个128位散列与两个不同的64位散列(非加密)?

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

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

回答

1

如果它们是极好的散列函数,那么碰撞概率应该是相同的。在实践中,我怀疑单独的散列函数会更好一些。

布隆过滤器是一种聪明的方式,通过将散列集合在一起,节省一些碰撞概率来节省内存。在理论上,人们可以用两个64位哈希与128位哈希的两半来完成相同的工作。您可能没有足够的RAM来存储位数,因此将其分割成(或使用单独的)4个32位散列并将它们叠加到包含2个位的布隆过滤器中是切实可行的= 2 = 2个位= 2个位字节= 1/2GB。

随着优异的64位散列函数[我回避术语“完美散列函数”,因为它具有特定的含义],两个条目意外碰撞的概率是2 -64 ,这是一个非常少数。

如果你有100G独特的项目,你需要100G = 10 或约2 哈希值,或73个散列位,获得具有没有碰撞到的概率1/2。