MurMurHash
MurMurHash由Austin Appleby在2008年發明,與其它流行的哈希函數相比,對於規律性較強的key,MurMurHash的隨機分布特征表現更良好,Redis,Memcached,Cassandra,HBase,Lucene中都使用到了這種hash算法。另外,Guava工具包提供了MurMurHash算法實現,Guava中的BloomFilter實現也用到了MurMurHash算法,Redis的java客戶端Jedis中也使用到了此算法。MurmurHash是一種經過廣泛測試且速度很快的非加密哈希函數。存在多種變體,名字來自兩個基本運算,即multiply和rotate(盡管該算法實際上使用shift和xor而不是rotate)。
MurmurHash3可以產生32位或128位哈希,舊版本MurmurHash2產生32位或64位值,MurmurHash2A變體添加了Merkel-Damgard構造,以便可以逐步調用它。MurmurHash64A針對64位處理器進行了優化,針對32位處理器進行MurmurHash64B優化。MurmurHash2-160生成160位哈希,而MurmurHash1已過時,實現規范的實現是用C++實現的,但是有多種流行語言的有效移植,已被很多開源項目采用。
具有良好的分布性,適用於機器學習用例,例如特征哈希和隨機投影,布隆過濾器中也有應用。MurMurHash3 128 位版本的速度是 MD5 的十倍。MurMurHash3 生成 32 位哈希的用時比生成 128 位哈希的用時要長。原因在於生成 128 位哈希的實現受益於現代處理器的特性。32 位哈希值發生碰撞的可能性就比 128 位的要高得多,當數據量達到十萬時,就很有可能發生碰撞。
CityHash
CityHash算法由Google公司於2013年公布,有兩種算法:CityHash64 與 CityHash128。它們分別根據字串計算64和128位的散列值。這些算法不適用於加密,但適合用在散列表等處。
Google一直在根據其數據中心常用的CPU對算法進行優化,結果發現對大多數個人計算機與筆記本同樣有效益。尤其是在64位寄存器、指令集級的並行,以及快速非對其內存存取方面。 該算法的開發受到了前人在散列算法方面的巨大啟發,尤其是Austin Appleby的MurmurHash。
CityHash的主要優點是大部分步驟包含了至少兩步獨立的數學運算,現代CPU通常能從這種代碼獲得最佳性能。
CityHash缺點:代碼較同類流行算法復雜。Google希望為速度而不是為了簡單而優化,因此沒有照顧較短輸入的特例。
總體而言,CityHash64與CityHash128是解決經典問題的全新算法。在實際應用中,Google預計CityHash64在速度方面至少能提高 30%,並有望提高多達兩倍。此外,這些算法的統計特性也很完備。
MurmurHash3 VS CityHash
CityHash是Google發布的字符串散列算法,和murmurhash一樣,屬於非加密型hash算法。CityHash算法的開發是受到MurmurHash的啟發。優點是大部分步驟包含了至少兩步獨立的數學運算。缺點是代碼較同類流行算法復雜。 Google 希望為速度而不是為了簡單而優化,因此沒有照顧較短輸入的特例 。
他們使用都比較簡單,主流語言基本都有實現,在速度方面 cityhash和murmurhash相比,速度略快。hash值位數方面murmurhash支持32、64、128bit, cityhash支持64、128、256bit。
代碼參考
1、https://github.com/google/cityhash
2、https://github.com/spaolacci/murmur3
3、https://en.wikipedia.org/wiki/MurmurHash