关于HashMap中的扰动函数的疑问

在研究JDK8 HashMap源码时,作者发现对于扰动函数的理解存在疑问。普遍观点认为,扰动函数是为了增加哈希值的随机性,减少碰撞。然而,作者通过实验(包括对不同基数的统计分析和碰撞率的计算)得出结论,扰动函数可能并不影响碰撞率。实验数据显示,无论是否使用扰动函数,碰撞率的均值趋于一致。作者对此结论感到困惑,不确定是自己理解错误,还是普遍认知有误,期望得到专业人士的指正。
摘要由CSDN通过智能技术生成

关于HashMap中的扰动函数的疑问

最近再看jdk8的hashmap源码,当看到这一步的时候有点疑问,去网上搜了一下,看到的所有文章基本上都是一篇抄一篇的(反正目前各大社区就是这么个状况),那个意思就是让高16位也参与运算,增加结果的随机性,减小hash碰撞???
在这里插入图片描述
乍一听好像是那么回事,但是越想越不对劲;我怎么都觉得是无论怎么运算最后不都是看低几位吗,在哪个固定的长度里每个数出现的概率不还是随机的吗(1/length);高位参与运算之后肯定能保证的是原来低位相同的值更加不同,但是不能保证本来不同的值运算后还是不通吧。怀着各种疑问,简单做了下实验。
与运算基数从2的4次幂到16次幂,分别对原始hash和扰动函数后的值进行统计
实验数据为随机8为的字符串值,平时我们用字符串作为key的情况最多吧
最后统计结果为:100次碰撞率的均值
代码:

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.Random;
import java.util.List;

/**
 * @description:
 * @author: wukong
 * @remark: create wukong 2019/12/26 22:49
 */
public class HashTest {
   
    public static void main(String[] args) {
   
        int length = 1 << 8;
        List<Double> doubles = new ArrayList<>(100);
        List<Double> double2s = new ArrayList<>(100);
        // 测试次数
        int count = 100;
        for (int i = 0; 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值