MurmurHash3原理讲解
Murmur哈希是一种非加密函数的哈希函数,下面我们在介绍哈希函数之前我们需要了解一下什么是好的哈希函数(可以通过下面两个测试)。
1.好的哈希函数应该通过卡方测试(chi-squared test)
卡方测试:
Xc2=∑i=0N−1(Oi−Ei)2/Ei,其中Oi为观察量,而Ei为估计量{X_c^2 = \sum_ {i=0}^{N-1}(O_i-E_i)^2/E_i},其中O_i为观察量,而E_i为估计量Xc2=∑i=0N−1(Oi−Ei)2/Ei,其中Oi为观察量,而Ei为估计量
我们测试的方案就是给出大量的数据,然后利用哈希函数计算出他们的哈希值,然后测试这批数据是否符合均匀分布。具体的做法可以参考数理统计第30讲(分类数据与分布拟合的卡方检验)里面的6.4.2的连续分布,也可以自己复习一下概率论与数理统计里面的对应章节的例题进行类比即可。
2.好的哈希函数应该通过雪崩测试(avalanche test)
指的是哈希函数对于输入的敏感度。比如对于一个输入的key1,得到了val1,接下来我们把key1的某一个位或者某一个字符改掉,得到val2,保证val1与val2中间变化的位数至少有50%,这说明对于微小的输入改动,得到的哈希值差别很大,哈希函数的输入敏感度很强。
3.Murmurhash3函数原理
从名字上来看,Murmurhash指的就是mutiply和rotate,组成murmur,即乘和旋转两个操作,但是实际上还有xor异或操作在名字中没有体现。
Murmurhash3分为三个步骤,我们来一步步的讲:
在讲解之前我们需要写出几个常量:(这些常量是根据我们前面两个测试实践测出来发现
这些数据效果是比较好的,当然也可以有更好的数据常量,下面只是做一个参考)
const unsigned int c1 = 0xcc9e2d51; // 3,432,918,353
const unsigned int c2 = 0x1b873593; // 461,845,907const int r1 = 15;
const int r2 = 13;const int m = 5;
const int n = 0xe6546b64; //3,864,292,196
//注意,对于32位的机器而言,一个word是4个byte即32bits,下面我们讲解的
//都是针对32位的机器
1.对输入的数据input_data进行4字节分组(每4个字节分一组)
例如:"abcdefghi" --> "abcd","efgh","i",前面两段是正常分组,而对于"i"则是剩余数据
下面我们对"abcde"作为讲解例子:
这里我们的第一个步骤就是对正常的分组数据进行计算:"abcd"
"abcd"==>0x61626364,我们赋给K = 0x61626364(这是一个32bit的block)
//接下来我们就进行下面的操作
K = K*c1
K = K rot by r1 (比如1010这个数据rot by 1,得到的结果就是0101,即进行循环左移一位)
K = K*c2
//在我们的murmurhash3的输入参数中,除了需要进行hash的数据,我们还需要一个随机
//数种子seed,这个seed是一个随机数,可以随机取,这里我定义h = seed
h = h ^ K
h = h rot by r2
h = h*m + n
//以上就是第一部分所左的工作,如果正常分组不止一组,就将上面的部分多循环几遍直到
//每一组都可以完成
//2.接下来我们处理剩余的数据remaining bytes = "e",下面的做法本质就是将数据倒置一下
//比如剩余数据是"efg",倒置得到:gfe,十六进制表示就是0x00676665
unsigned int k = 0
switch(len(remaining_bytes)){case 3:k^=remaining_bytes[2]<<16;case 2:k^=remaining_bytes[1]<<8;case 1:k^=remaining_bytes[0];
}
//然后做如下变换:
k = k * c1
k = k rot by r1
k = k * c2
h ^= k//h是上一步得到的数据
h ^= len(input_data)//本例的input_data = "abcde"那么这里就是h^=5
//到这里我们的第二步就结束了
//3.接下来这一步是最后一步,作用是强化通过雪崩测试,加强输入敏感性,下面的常量内容
//都是经验值,总的步骤就是异或,乘,异或,乘,异或h ^= h >> 16;h *= 0x85ebca6b; // 2,246,822,507h ^= h >> 13;h *= 0xc2b2ae35; // 3,266,489,909h ^= h >> 16;
经过上面的三步最后得到的h就是我们的哈希值了。
代码在这里
MurmurHash3原理讲解相关推荐
- php 伪静态 page-18.html,PHP 伪静态实现技术原理讲解
PHP 伪静态实现技术原理讲解 发布于 2015-01-18 23:52:58 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pre ...
- nginx反向代理原理讲解
一 .概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器:并将从服务器上得到的结果 ...
- 微信小游戏开发教程-2D游戏原理讲解
微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...
- 解密汽车全景行车安全系统的前世和今生——第二讲:原理讲解
解密汽车全景行车安全系统的前世和今生--第二讲:原理讲解 来源:深圳市汽车电子行业协会 作者:姜卫忠 发布时间:2013-3-7 浏览(4648)次 解密汽车全景行车安全系统的前世和今生 第二讲:全 ...
- pureMVC简单示例及其原理讲解四(Controller层)
本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...
- IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解
IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解 0.前言 一.光学传感器模块: 1. 光敏传感器模块: 2. 红外避障模块 3. 循迹传感器模块 4. U型光电传感器模块 5. 红外接收模 ...
- 艺点动画-跟随原理讲解
艺点动画-跟随原理讲解 如果要想顺便解决就业问题的话,可以去试试看成都艺点动画,这家教学质量, 蛮高的毕业后是可以直接在公司里面上班的 方法/步骤 1.什么是动画里的跟随? 动画的跟随指的是:物体在运 ...
- 酷狗音乐的爬取,基于python,从无到有完整教程-上:搭建环境及爬取原理讲解
酷狗音乐的爬取,基于python,从无到有完整教程,使用微软新edge作为虚拟浏览器 搭建环境及爬取原理讲解 ⬇⬇⬇ 编码环境及工具准备: 编码工具:PyCharm 所需的库: import requ ...
- AMCL算法原理讲解
ROS进阶教程(二)AMCL算法原理讲解 AMCL算法理解 蒙特卡洛定位算法 蒙特卡洛定位算法自适应变种 里程计运动模型 测距仪模型 波束模型 似然域模型 AMCL算法理解 AMCL(adaptive ...
最新文章
- 统一沟通-技巧-11-Lync-联盟-1-MSN
- 介绍几个移动web app开发框架
- 头文件包含【预处理】(58)
- 面向云原生的混沌工程工具-ChaosBlade
- 佳能打印机ip90 64位系统的驱动_佳能打印机如何安装 佳能打印机漏墨如何解决【详解】...
- java corba_Java编写CORBA的一个简单例子(CORBA入门)
- 遍历枚举,添加进DropDownist
- win10鼠标指针修改
- 计算机视觉大佬--何凯明
- 在树莓派上安装MongoDB
- ROS-3DSLAM(十二)lvi-sam源代码阅读10 —— visual_loop阅读3 + ORB学习
- 第9章 保护Web应用----概念梳理
- 动漫线稿怎么画才流畅
- V8常见去优化原因一览
- 文献阅读1:基于旋量理论的串联机器人运动特性研究现状
- centos7 安装极点五笔
- linux 将sda分区扩容
- 2021面试第二弹来袭
- 微型计算机aspire1600x,Acer 1600X小型机拆解
- 【原创】Firda+typescript 接收WX消息
热门文章
- 计算机网络学习笔记之概述
- 【数据结构】常见的排序方法的实现以及性能对比
- Map集合中两个重要的取值方法---keySet()和entrySet()
- 天创速盈:店铺怎么推广?这些你都懂了吗?
- 不作为的领导,锁住了劳动者的创新,以及手脚
- 微型计算机基础pdf,微型计算机的基础知识.pdf
- 解释型语言和编译型语言的概述及其执行过程
- 基于javaweb图书管理系统
- Ezee Graphic Designer 2.0.21 特别版 Mac 平面设计师模板套装
- linux下的strerror文件,linux下错误的捕获:errno和strerror的使用