.Net Core 中的 MurmurHash


    MurmurHash 是一種非加密型哈希算法,適用於一般的哈希檢索操作,具有高性能、低碰撞率的特點。由 Google 的工程師 Austin Appleby 於2008年創建。MurmurHash 與其它流行的哈希函數相比,對於規律性較強的 Key,其隨機分布特征表現的更好。非加密意味着着相對 MD5,SHA 這些函數它的性能更高(性能是 MD5 等加密算法的十倍以上),也正是由於它的這些優點,所以雖然它出現於2008年,但目前已經廣泛應用到 Redis 等眾多著名的軟件中。MurmurHash 提供了兩種長度的哈希值,32 bit,128 bit。MurmurHash 的英文為:(multiply and rotate) and (multiply and rotate)。

    最新版本是 MurmurHash3,基於MurmurHash2 改進了一些小瑕疵,使得速度更快,尤其對大塊的數據,具有較高的平衡性與低碰撞率。

    .Net Core 使用 MurmurHash 要先使用 NuGet 添加 System.Data.HashFunction.MurmurHash 這個包。

//using System.Data.HashFunction.MurmurHash;
byte[] srcBytes = Encoding.UTF8.GetBytes("001");
// HashSizeInBits=32 or 128
var cfg = new MurmurHash3Config() { HashSizeInBits = 32,  Seed = 0 };
var mur = MurmurHash3Factory.Instance.Create(cfg);
var hv = mur.ComputeHash(srcBytes);
var base64 = hv.AsBase64String();
var hashBytes = hv.Hash;

對於規律性較強的 key,MurmurHash 的隨機分布特征表現更良好,簡單測試如下:
String   Hash值(Base64)
001 => oPj2oQ
002 => HWDyLA
003 => Qiz+PQ

雖然字符串 001,002,003 有規律,但其 Hash 值 oPj2oQ,HWDyLA,Qiz+PQ 已經沒有規律了;

 

String   Hash值(Base64)
ade => HGGhPQ
bde => Ourovw
cde => slivpw

雖然字符串 ade,bde,cde 有規律,但其 Hash 值 HGGhPQ,Ourovw,slivpw 已經沒有規律了。

 

HashSizeInBits=128時, Base64的Hash值長度是22位;HashSizeInBits=32時, Base64的Hash值長度只有6位;6位長度Hash值,很適合用於一般的哈希檢索。

英文 (multiply and rotate) and (multiply and rotate)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM