高运算性能,低碰撞率的hash算法
redis已经使用了。spring导入redis有这个类,可以体验一下package redis.clients.util;
引用redis后直接可以使用
import redis.clients.util.MurmurHash;
MurmurHash hash = new MurmurHash();
整体感觉类似揉面团
切了很多面剂子,擀成面饼子,摞一起压实之后,继续和面。
如果整个面团揉成长条形时,不同位置的颜色不同,那么可能,切成面剂子,擀成面饼子,摞一起压实之后,继续和面,颜色已经很均匀了。
细节是4个字节一个剂子,一个初始变量0x5bd1e995和剂子混合,和吧和吧,再把下一个剂子加进来重复这个步骤直到所有剂子都和进去。
while (buf.remaining() >= 4) {
k = buf.getInt();
k *= m;
k ^= k >>> r;
k *= m;
h *= m;
h ^= k;
}
源码这里,就是和面的地方。每个剂子加进来之后的和面过程。
理解起来差不多,只是和面实际情况是和面过程中加入面剂子会把面团越和越大,而计算hash一直没有改变数据的存储空间,
多余的不需要的在右移24位k >>> r时已经被舍弃。没有导致最后的数据越来越大。
如果类比一下,可以在面剂子加进来之后找个固定大小的模具把面团某些部分塞进去,其他剩余的扔了。就和murmurhash的操作差不多了。
最后的结果,依旧是,天知道,鬼知道,反正我不知道