Java中string中hashcode_为什么String中的Java hashCode()使用31作为乘数?

从JDK-4045622开始,Joshua Bloch描述了选择特定(新) String.hashCode() 实施的原因

下表总结了上述各种哈希函数的性能,对于三个数据集:1)Merriam-Webster的第二个国际未删节字典中的所有单词和短语(311,141个字符串,平均长度为10个字符) . 2)/ bin /,/ usr / bin /,/ usr / lib /,/ usr / ucb /和/ usr / openwin / bin / *(66,304字符串,平均长度为21个字符)中的所有字符串 . 3)昨晚运行了几个小时的网络爬虫收集的URL列表(28,372个字符串,平均49个字符) . 表中所示的性能度量是散列表中所有元素的“平均链大小”(即,与查找元素相比,密钥数量的预期值) . Webster的代码字符串URL

当前的Java Fn . 1.2509 1.2738 13.2560

P(37)[Java] 1.2508 1.2481 1.2454

P(65599)[Aho等] 1.2490 1.2510 1.2450

P(31)[K R] 1.2500 1.2488 1.2425

P(33)[Torek] 1.2500 1.2500 1.2453

Vo的Fn 1.2487 1.2471 1.2462

WAIS Fn 1.2497 1.2519 1.2452

Weinberger的Fn(MatPak)6.5169 7.2142 30.6864

Weinberger的Fn(24)1.3222 1.2791 1.9732

Weinberger的Fn(28)1.2530 1.2506 1.2439

看看这个表,很明显除了当前的Java函数和Weinberger函数的两个破坏版本之外的所有函数都提供了极好的,几乎无法区分的性能 . 我强烈推测这种性能本质上是“理论上的理想”,如果你用一个真正的随机数发生器来代替散列函数,那就是你所得到的 . 我排除了WAIS函数,因为它的规范包含随机数页面,并且它的性能并不比任何更简单的函数更好 . 其余六个功能中的任何一个看起来都是很好的选择,但我们必须选择一个 . 我想我会排除Vo的变体和Weinberger的功能,因为它们增加了复杂性,尽管很小 . 在剩下的四个中,我可能选择P(31),因为它是在RISC机器上计算最便宜的(因为31是2的两个幂的差异) . P(33)计算起来同样便宜,但它的表现稍微差一点,而且33是复合的,这让我有点紧张 . 玩笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值