murmurhash为什么那么快,冲突那么少

Pory 2017-01-05 08:33:49
最近在用murmur哈希,有个疑问,他的算法不复杂,但为什么效果那么好,冲突少,速度快,而且算法里有几个常数,设置的很巧妙,但不明白为什么?求高人指点
...全文
1263 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
打败猫的老鼠 2018-07-27
  • 打赏
  • 举报
回复
你确定是冲突少么?为什么我试验用jdk的hash算法,比他冲突更少,是我代码的原因吗?public class Test {
public static void main(String[] args) {

HashFunction hf = Hashing.murmur3_32();
Integer testSize = 20000000;
Set<Integer> set = Sets.newHashSetWithExpectedSize(testSize);
int containsSize = 0;

for(int i = 0; i < testSize; i++) {
int tmp = hf.newHasher().putString(String.valueOf(i), Charsets.UTF_8).hash().asInt();
if(set.contains(tmp)) {
containsSize++;
} else {
set.add(tmp);
}
}
System.out.println("murmurhash containsSize=" + containsSize);
System.out.println("murmurhash dup_ratio =" + containsSize / (1.0 * testSize));

System.out.println("#####################################");

Set<Integer> set2 = Sets.newHashSetWithExpectedSize(testSize);
int containsSize2 = 0;
for(int i = 0; i < testSize; i++) {
int tmp2 = String.valueOf(i).hashCode();
if(set2.contains(tmp2)) {
containsSize2++;
} else {
set2.add(tmp2);
}
}

System.out.println("JDK hash containsSize=" + containsSize2);
System.out.println("JDK hash dup_ratio =" + containsSize2 / (1.0 * testSize));
}
}
结果:
murmurhash containsSize=46704
murmurhash dup_ratio =0.0023352
#####################################
JDK hash containsSize=8288
JDK hash dup_ratio =4.144E-4

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧