murmurhash是適用於基於常規雜湊的非加密
當前版本是murmurhash3,[4]
[5],它產生32位或128位雜湊值。
murmur3_32(key,len,seed)
//注意:在此版本中,所有算術都是使用無符號的32位整數執行的。
//如果發生溢位,結果將以2 32為模降低。
c1←0xcc9e2d51
c2←0x1b873593
r1←15
r2←13
m←5n←0xe6546b64
雜湊←種子
對於每個fourbytechunk鍵
k←fourbytechunk
k←k×c1
k←k rol r1
k←k×c2
雜湊←雜湊xor k
雜湊←雜湊rol r2
雜湊←(雜湊×m)+ n
與任何剩餘的bytesinkey
剩餘位元組數←swaptolittleendian(remainingbytesinkey)
//注意:只有在大字節序計算機上才需要位元組序交換。
//目的是將有意義的數字放在該值的低端,
//以便這些數字
在隨後的乘法運算中
具有最大的影響// 低範圍數字的潛力。考慮到將有意義的數字//
定位在高範圍內將對乘法
的高數字產生更大的影響,並且值得注意的是,這樣的高數字很可能被溢位下的模運算丟棄。我們不想要那個。
剩餘位元組←剩餘位元組×c1
剩餘位元組←剩餘位元組rol r1
剩餘位元組←剩餘位元組×c2
雜湊←雜湊xor剩下的位元組數
雜湊←雜湊xor len
雜湊←雜湊xor(雜湊》 16)
雜湊←雜湊×0x85ebca6b
雜湊←雜湊xor(雜湊》 13)
雜湊←雜湊×0xc2b2ae35
雜湊←雜湊xor(雜湊》 16)
演算法實現(c語言):
uint32_t murmur3_32(const uint8_t* key, size_t len, uint32_t seed)
while (--i);
}if (len & 3) while (--i);
k *= 0xcc9e2d51;
k = (k << 15) | (k >> 17);
k *= 0x1b873593;
h ^= k;
}h ^= len;
h ^= h >> 16;
h *= 0x85ebca6b;
h ^= h >> 13;
h *= 0xc2b2ae35;
h ^= h >> 16;
return h;
}
雜湊之開雜湊,閉雜湊
有沒有一種方法時間複雜度,僅僅o 1 尼,那麼我們就要構造一種儲存結構,通過某種函式是之元素與它對應的關鍵碼之間能建立一一對映的關係,那麼自然通過之中一一對映的關係,我們就可以很快的找到我們需要的元素。所以進入雜湊這個這題首先我們需要乙個我們下標,這個下表在雜湊當中 我們就稱之為雜湊位址。而這個位址...
雜湊雜湊雜湊雜湊
雜湊,是解決字串 實際上是各種類 問題的重要工具,講字串儲存讀取速度降低到了線性,雜湊的用法十分豐富,可以用了進行狀態壓縮等。include include include includeusing namespace std 這與jdk string.hashcode 的函式在足夠大的資料下失配率...
雙雜湊和再雜湊暨雜湊表總結(附理解)
先說明一下,她們兩個屬於不同的範疇,雙雜湊屬於開放定址法,仍是一種解決衝突的策略。而再雜湊是為了解決插入操作執行時間過長 插入失敗問題的策略。簡而言之,她們的區別在於 前者讓雜湊表做的 對 把衝突元素按規則安排到合理位置 後者讓雜湊表具有了可擴充性,可以動態調整 不用擔心填滿了怎麼辦 我們來考察最後...