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



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

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

让我们简单实现一个哈希映射来存储键值对。
假设有一个分配的存储区域,其大小为 allocated_size 键,大小相同。
用于存储新对的存储索引是用一个简单的模计算的,如 hash_index = (hash_code(key) % allocated_size)
如果此hash_index的插槽是空闲的,我们就完成了,我们只是将键和值存储在此索引中。
如果此hash_index的插槽已被占用,则取决于:

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

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

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

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

最新更新