【问题标题】:How to ensure/force equal distribution in a HashMap?如何确保/强制在 HashMap 中平均分配?
【发布时间】:2013-02-10 03:35:38
【问题描述】:

HashMap 数据结构根据键的哈希码在其桶中分配键。大多数情况下,如果散列算法非常好,所有密钥都将分布在不同的桶中。但是,如果所有键都返回相同的哈希码怎么办?插入/检索操作的顺序为 O(n)。

如果我正在实现自己的 HashMap,我将如何(或者我应该怎么做)确保桶之间的平等分配?有没有办法?

【问题讨论】:

    标签: java data-structures hash hashmap


    【解决方案1】:

    但是如果所有的键都返回相同的哈希码呢?

    那你输了比赛,你也无能为力了。

    不过不用担心,因为您的数据结构实际上并不关心 - 您的数据结构的 用户 可能,但在第一种情况下,他们是负责实现病态 hashCode 的人.

    理论上,即使是恶意选择的输入值也可以通过universal hashing 合理平均分配,但在 Java 中,这确实不是一种选择。

    【讨论】:

      【解决方案2】:

      在密钥上运行 DES 之类的东西来生成哈希值。一个体面的加密算法可以保证结果看起来是随机的。

      【讨论】:

      • 生成散列 从什么? 在 Java 中,HashMap 的使用者,而不是数据结构的作者,可以选择 hashCode() 实现。
      • 您可以随机生成哈希,但这会在检索中产生真正的问题。我可以创建一个由 TreeMap 数组支持的 HashMap。这样我就可以依靠密钥的可比性来进行插入/检索(并希望在 Log(n) 中完成所有这些操作)。但这只是将问题推迟到 Comparable 函数。有没有我可以使用的数学函数?还是其他一些设计模式?
      • 为什么它会在检索时产生问题?键总是散列到相同的值。
      猜你喜欢
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多