当前位置: 首页 > 面试题库 >

为什么HashMap重新哈希键对象提供的哈希码?

夏侯智鑫
2023-03-14
问题内容

我正在阅读Java 1.6 API提供的HashMap类的代码,无法完全理解以下操作的需要(位于put和get方法的主体中):

int hash = hash(key.hashCode());

该方法hash()具有以下主体:

 private static int hash(int h) {
         h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

通过对提供的哈希码执行位操作,可以有效地重新计算哈希。即使API声明如下,我也无法理解这样做的必要性:

这很关键,因为HashMap使用2的幂的哈希表,否则哈希表在低位无差异时会遇到冲突。

我确实知道键值参数存储在数据结构数组中,并且该数组中项的索引位置由其哈希值确定。我不明白的是,该函数将如何为哈希分布添加任何值。


问题答案:

就像Helper所写的那样,以防万一关键对象的现有哈希函数出现故障,并且不能很好地混合低位比特。根据pgras引用的消息来源,

 /**
  * Returns index for hash code h.
  */
 static int indexFor(int h, int length) {
     return h & (length-1);
 }

哈希以2的幂进行“与”运算(因此,length-1保证为1的序列)。由于此ANDing,仅使用的低位h。的其余部分将h被忽略。想象一下,无论出于何种原因,原始哈希仅返回可被2整除的数字。如果直接使用它,则永远不会使用哈希图的奇数位置,从而导致冲突次数增加2倍。在真正的病理情况下,错误的哈希函数会使哈希表的行为更像列表而不是O(1)容器。

Sun工程师必须进行运行测试,这些测试表明太多的哈希函数在其低位中不够随机,并且许多哈希图的大小不足以使用高位。在这种情况下,hash(int h)即使需要额外的计算,HashMap中的位操作也可以在大多数预期用例上提供净改进(由于较低的冲突率)。



 类似资料:
  • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

  • 问题内容: 我只是在阅读有关Java中HashMap和HashTable类之间的区别。在那里,我发现了一个区别,即前者允许空键,而后者则没有特权。就HashMap的工作而言,我知道,它在键上调用hashcode方法,以查找要在其中放置该键值对的存储桶。我的问题来了:如何计算空值的哈希码?或者空键的哈希码是否有任何默认值(如果需要,请指定该值)? 问题答案: 从HashMap: 如果进一步看,您会发

  • 从原理到应用分析什么是哈希? 一、什么是哈希? 哈希(hash):将任意长度的输入(关键字),通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值,通常哈希值代表了关键字的存储位置。 但是为什么要这样做呢?或者说,哈希是怎样来的呢? 哈希的出现解决了两个问题:存储和搜索。 1. 存储(数据结构):如果在容器中保存对象及其关联的键,并且不用键

  • HashMap将其数据保存在存储桶中,如下所示: 要在HashMap中放置一些东西,我们需要一个hash()函数,它返回从0到table.length()范围内的关键哈希,对吗? 假设我有: 这将返回以下内容: 字符串本机哈希代码:46882035,哈希映射哈希:46882360 我们应该有大约256个桶(所以关键的散列应该在0到256的范围内),但是HashMap中的内部散列给了我们468823

  • 问题内容: 从这个问题出发,我很想知道何时 计算 python对象的哈希值? 在某个实例的时间 第一次叫 每次都被调用,或者 我还有其他机会吗? 这可能会根据对象的类型而有所不同吗? 为什么其他整数等于其哈希值呢? 问题答案: 通常可以在每次使用哈希时进行计算,因为您可以很容易地检查一下自己(请参阅下文)。当然,任何特定对象都可以自由缓存其哈希。例如,CPython字符串执行此操作,但元组不执行此

  • 如果我在hashmap中输入一个键和值,并且基于键hashcode生成的索引大于15,并且映射大小仍然小于阈值(即12),会发生什么? 提前谢谢。