关于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;