为什么不:
public native long hashCode();
而不是:
public native int hashCode();
是否有更高的机会获得唯一的哈希码?
答案 0 :(得分:23)
因为maximum length of an array是Integer.MAX_VALUE
。
由于hashCode()
的主要用途是确定将对象插入HashMap
/ Hashtable
的后备数组中的哪个插槽,因此哈希码> Integer.MAX_VALUE
将无法存储在数组中。
答案 1 :(得分:1)
无论如何,哈希码值将用于确定表中值相对较小的行数。
例如,在HashMap
中,默认表包含 256行仅16行(Sun JDK 1.6.0_17)。这意味着行号的确定方式如下:
int rowNumber = obj.hashCode() % rowsCount;
因此,实际分布从0到rowsCount
。
UPD :我记得ConcurrentHashMap
的实施情况。简而言之,ConcurrentHashMap
包含许多相对较小的表。首先,hashCode
函数用于确定表号,然后使用相同的函数来确定所选表中的行。
这种方法消除了数组大小的限制(甚至允许构建分布式哈希表)。
因此,我倾向于得出hashCode
返回int
的结论,因为它涵盖了绝大多数用例。
答案 2 :(得分:0)
我认为这是计算成本与哈希范围的平衡。经常引用Hashcodes,每次需要哈希值时,推送数据量的两倍会很昂贵,尤其是如果考虑更常见的用例 -
例如- 如果您创建一个包含10或100或1000个值的小哈希值,那么您将看到的哈希冲突数量的差异将极其微不足道。对于更大的哈希,...好吧,想想10 ** 32值开始频繁碰撞需要多大的散列,以及考虑到你需要的内存量,是否可以在JVM中做到这一点