用户登录
用户注册

分享至

.Net Core 中的 MurmurHash

  • 作者: 算命花生
  • 来源: 51数据库
  • 2021-08-22

    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)

软件
前端设计
程序设计
Java相关