【问题标题】:What happens if you try to insert two same objects with different hashcode in hashmap?如果您尝试在 hashmap 中插入两个具有不同 hashcode 的相同对象会发生什么?
【发布时间】:2015-01-27 10:33:37
【问题描述】:

如果您尝试在 hashmap 中插入两个具有不同 hashcode 的相同对象会发生什么?

【问题讨论】:

  • 如果它们具有不同的哈希码,那么就哈希图而言,它们的所有意图和目的都是不同的。
  • hashmap 使用的函数等于(或等效)的两个对象产生 true,但具有不同的哈希码:是否允许这种情况或如何处理我想我取决于语言/实现。
  • 简单的答案:他们会被插入。哦,是的,会有重复的。但是两个相同的对象如何得到不同的哈希码是非常令人费解的。这不是说散列函数是错误的吗?

标签: data-structures language-agnostic hashmap theory


【解决方案1】:

这意味着散列函数已损坏(至少从散列表的角度来看),因此它的行为方式可能无法预测(可能会插入重复项)。

【讨论】:

    【解决方案2】:

    让我们通过一个哈希映射的简单实现来存储键值对。
    假设有一个分配的存储区域,其大小为allocated_size,用于键和相同的值。
    用于存储新对的存储索引使用简单的模数计算,例如 hash_index = (hash_code(key) % allocated_size)
    如果这个 hash_index 上的 slot 是空闲的,我们就完成了,我们只需将 key 和 value 存储在这个索引上。
    如果这个 hash_index 处的 slot 已经被占用,那么取决于:

    • 如果这个槽的键相等,那么我们就完成了,我们找到了hash_index,我们将覆盖关联的值;
    • 如果这个槽的key不同,那么我们必须扫描hash_index+1的存储,直到找到一个相等的key,或者一个空槽。

    现在,假设我们有两个相等键的 hash_codes 33 和 53。

    • 如果allocated_size为20,那么两个hash_codes模20相等,我们将存储一个对象(第二次插入会覆盖第一个);
    • 如果allocated_size 是21,那么两个hash_code 模21 是不同的,我们可能会存储这个key 的两次出现,每个都有自己的值,这取决于两个hash_index 之间的插槽占用情况,并且取决于顺序插入对...

    您在此处观察到的是典型的未定义行为。我很确定更精细的实现会遇到相同的问题,所以不,两个相等的键不应有不同的哈希码,这是一个损坏的哈希函数。

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多