【问题标题】:One 128bit hash vs. two different 64bit hashes (non-crypto)?一个 128 位散列与两个不同的 64 位散列(加密)?
【发布时间】:2014-09-25 19:28:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: hashmap statistics bloom-filter


    【解决方案1】:

    如果它们是非常出色的哈希函数,那么冲突概率应该是相同的。在实践中,我怀疑单独的哈希函数会表现得更好。

    布隆过滤器是一种节省内存的巧妙方法,它通过 BITOR 将哈希集组合在一起,权衡一些冲突概率。理论上,可以使用两个 64 位散列而不是 128 位散列的两半来完成相同的工作。您可能没有足够的 RAM 用于 2128 位,因此将其拆分为(或使用单独的)4 个 32 位散列并将它们覆盖到包含 232 位 = 229 字节 = 1/2 GB。

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

    如果您有 100G 的唯一项,则需要 100G2 = 1022 或大约 273 个哈希值,或 73 个哈希位,以将 no 冲突的概率降至 1/2。

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2011-07-30
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2017-12-02
      • 2021-12-11
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多