为什么不这样做:
public native long hashCode();
使用替代方案:
public native int hashCode();
为了更高的概率获得独特的哈希码?
为什么不这样做:
public native long hashCode();
使用替代方案:
public native int hashCode();
为了更高的概率获得独特的哈希码?
由于数组的最大长度为Integer.MAX_VALUE
,请参阅此处。
hashCode()
的主要用途是确定要将对象插入到 HashMap
/Hashtable
的后备数组中的哪个槽中。因此,如果 hashcode > Integer.MAX_VALUE
,则无法将其存储在数组中。
int rowNumber = obj.hashCode() % rowsCount;
所以,真正的分布范围是从0到rowsCount
。
更新:我记得ConcurrentHashMap
的实现。简而言之,ConcurrentHashMap
包含许多相对较小的表格。首先使用hashCode
函数确定表格编号,然后再使用相同的函数确定所选表格中的行。
这种方法消除了数组大小的限制(甚至允许构建分布式哈希表)。
因此,我倾向于结论,hashCode
返回int
,因为它涵盖了绝大多数的用例。
HashMap
构造函数。 - matt b(obj.hashCode &0x7fffffff)%rowCount
。由于模运算大约需要30个CPU时钟(位运算只需要1个),所以条目数保持为2的幂次,并且操作就是 (obj.hashCode & (array.length-1))
。 - bestsss我认为这是计算成本与哈希范围的平衡。哈希码被引用的频率非常高,每次需要哈希时传递两倍的数据会很昂贵,特别是考虑到更常见的用例 - 例如 - 如果你创建一个小的哈希具有10、100或1000个值,你将看到的哈希冲突数差异极其微不足道。对于较大的哈希,想想一个哈希需要多大才能让10**32个值开始频繁发生冲突,以及在JVM中是否可能做到这一点,考虑到需要的内存量。