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

时间:2015-01-27 10:33:37

标签: data-structures language-agnostic hashmap theory

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

2 个答案:

答案 0 :(得分:2)

这意味着哈希函数被破坏(至少从哈希表的角度来看),因此它可以以不可预测的方式运行(可能会插入重复项)。

答案 1 :(得分:1)

让我们采用散列映射的简单实现来存储键值对 假设分配的存储区域大小为allocated_size,密钥和值相同 用于存储新对的存储索引使用类似hash_index = (hash_code(key) % allocated_size)的简单模来计算 如果此hash_index的插槽是空闲的,我们就完成了,我们只将密钥和值存储在此索引处 如果此hash_index的插槽已被占用,则它取决于:

  • 如果此插槽中的密钥相等,那么我们就完成了,我们找到了hash_index,我们将覆盖相关的值;
  • 如果此插槽中的密钥不同,则我们必须扫描hash_index+1处的存储空间,直到找到相同的密钥或空插槽。

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

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

您在此处观察到的是典型的未定义的行为。我很确定更精巧的实现会遇到类似的问题,所以不,两个相等的键 SHALL NOT 具有不同的哈希码,它是一个破坏的哈希函数。