• .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)

  • 相关阅读:
    POJ3253Fence Repair(优先队列或单调队列)
    POJ3630Phone List(字典树)
    HDU1896Stones(优先队列)
    POJ3468 A Simple Problem with Integers(线段树延时标记)
    HDU3535AreYouBusy(分组背包)
    C++ 学习涨姿势汇总
    [C++] std::vector 使用
    Cocos2dx-3.2 引擎学习(四)之CCScheduler
    Cocos2dx-3.2 引擎学习(三)之AssetsManager
    Cocos2dx-3.2 引擎学习(二)之Director
  • 原文地址:https://www.cnblogs.com/anjou/p/MurmurHash.html
Copyright © 2020-2023  润新知