Murmur哈希算法

說到哈希算法,可能大部分人都會不自覺得想到 md 和 sha 系列,在這之前,我就是這樣的,因為他們意味著流行安全和穩定。但是,最近我知道了一款另類的流行的哈希函數,這款哈希函數廣泛應用于分布式系統-Hadoop/Lucence等等,原因就是因為它速度快而且散列效果好,這個哈希算法就是 MurmurHash。

哈希系列比較流行的有三個系列,分別是 MD/SHA 和 MAC 系列,但是這些系列都是比較安全,雖然 MD5 和 SHA-1 已經被王小云教授碰撞了,但是相對我們平時使用的直接簡單求模這種還是比較安全的,相對安全帶來的負面效果就是計算量還是挺大的,而且不保證哈希結果的均勻。而在分布式環境下,為了資源的合理利用,我們需要的更多是均勻,因為是內部散列的作用,所以哈希安全我們并不那么在乎,所以在這種情境下,2008 才被發明的 MurmurHash 成為了分布式中的寵兒,深受 Google 系的喜愛。

MurmurHash 當前最新的版本是 MurmurHash3,它能夠產生出32-bit或128-bit哈希值。除了我們能夠猜到的不再使用的 mmh1 以及 還在使用的 mmh2 之外,還有好些變種,不過都是針對平臺優化的。

Murmur哈希的算法確實比較簡單,它的計算過程其實就是它的名字,MUltiply and Rotate,因為它在哈希的過程要經過多次MUltiply and Rotate,所以就叫 MurMur 了。

算法原理可參考維基百科:https://zh.wikipedia.org/wiki/Murmur%E5%93%88%E5%B8%8C

Scala API自身是有MurmurHash算法的實現的(scala.util.hashing.MurmurHash3),返回值是int,32位。

spark也廣泛采用了Murmur哈希算法,可以看一個在sparksql中的例子,在TreeNode類中有:

private lazy val _hashCode: Int = scala.util.hashing.MurmurHash3.productHash(this)

之所以調用productHash方法是因為TreeNode繼承自scala的Product特質(有興趣的同學可以通過反編譯查看到,scala 的Case class類實現了scala.Product和scala.Serializable接口(Product和Serializable都是Traits)),而且有很多case class 類繼承TreeNode類。

參考:
https://liqiang.io/post/murmurhash-introduction
https://leibnizhu.github.io/2017/01/19/Scala%E5%AE%9E%E7%8E%B064%E4%BD%8D%E7%9A%84MurmurHash%E5%87%BD%E6%95%B0/index.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。