【问题标题】:Ensuring One Value per Hashmap bucket/slot确保每个 Hashmap 桶/槽一个值
【发布时间】:2012-12-25 21:14:35
【问题描述】:

有没有办法严格确保每个 Hashmap 桶的条目数,而不会篡改 Java 中的 object.hashcode() 函数?

负载因子是一个平均值:(条目数)/(桶数)。本质上,假设我有一个容量为 1000 的 Hashmap。为了这个示例,假设我使用 1 的负载因子。我将要存储在 HashMap 中的 100 个对象具有错误的哈希码函数,它总是返回每个对象的值相同。当我存储完 100 个对象后,它们都将映射到同一个 HashMap 存储桶,我最终会获得 LinkedList 的性能。负载因子将保持沉默,因为 100 个条目 / 1000 个桶 = 0.1 LF,所以永远不会调整 HashMap 的大小(无论如何都不会使用)。

我知道这在现实世界中并不常见,但我想提高我的理解。 HashMap 有没有办法防止这种情况发生,或者至少从结构本身得到一些警告?

【问题讨论】:

  • IdentityHashMap 能满足您的需求吗?
  • 我想你已经回答了你自己的问题 - 这是 hashCode 方法。这就是你在使用 HashMaps 时使用的合约。

标签: java collections map hashmap


【解决方案1】:

HashMap 将始终根据密钥的哈希码计算要使用的存储桶。如果每个键具有相同的哈希码,它们都将映射到同一个桶。如果不提供更好的 hashCode() 实现,您将无法阻止您描述的行为。

您可以查看使用开放寻址的 Map 实现(例如 TroveTHashMap)。他们总是每个桶只有一个条目。但是性能不会提高,它们只是以不同的方式处理冲突,而且它们也无法解决您的根本问题:哈希码错误。

【讨论】:

  • +1。如果所有键都具有相同的哈希码,则无论其编写的多么智能,没有任何哈希表实现可以比线性时间查找做得更好。
【解决方案2】:

编写完美的 HashFunction 是实现您所寻找的唯一方法。

给定一个小的特权输入集,可以调整排列表,以便这些输入产生不同的哈希值,从而产生所谓的完美哈希函数。

查看Pearson's Hashing

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多