欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net Core 中的 MurmurHash

程序员文章站 2022-07-09 21:59:15
MurmurHash 是一种非加密型哈希算法,适用于一般的哈希检索操作,具有高性能、低碰撞率的特点。由 Google 的工程师 Austin Appleby 于2008年创建。MurmurHash 与其它流行的哈希函数相比,对于规律性较强的 Key,其随机分布特征表现的更好。非加密意味着着相对 MD ......

    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)