高運算性能,低碰撞率的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的操作差不多了。
最后的結果,依舊是,天知道,鬼知道,反正我不知道