murmur 算法

简介

MurmurHash是一种高效的非加密哈希函数,适用于哈希表中的一般哈希任务。
MurmurHash的名称来源于Murmur,意为一种低频的声音,体现了其设计的低碰撞率和高性能。
名称来自两个基本操作,乘法(MU)和旋转(R),在其内部循环中使用。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。
MurmurHash与加密散列函数不同,它不是专门设计为难以被对手逆转,因此不适用于加密目的。它常被应用于分布式系统,很多开源项目如Kafka、Redis,Memcached,Cassandra,HBase,Elasticsearch等等都使用它。
MurmurHash的当前的版本是MurmurHash3,能够产生出32-bit或128-bit哈希值。

优点和缺点

速度快,比安全散列算法快几十倍;
变化足够激烈,相似的字符串如“abc”和“abd”能够均匀散落在哈希环上;
高熵:确保输入的微小变化会显著改变输出,减少碰撞。
高性能:利用简单的位操作和混合步骤,适用于现代处理器。
确定性:相同的输入总是生成相同的输出。

不保证安全性(缺点)

算法原理

以MurmurHash3_x86_32为例,它适用于32位系统,并输出32位的哈希值。下面是MurmurHash3的主要步骤:

初始化

设置一个种子(seed)值,用于初始化哈希值。这样可以通过不同的种子来生成不同的哈希值。

处理块(chunks)

输入数据被分成固定大小的块(通常为4 bytes)。每个块使用一次哈希函数。
对于每个块,首先将它们视为32位整数。

混合过程:

对每个32位块进行一系列位操作,包括乘法、左移和右移。这些操作用来混合位,使得输入的不同位对最终哈希值有较大的影响。
具体的混合步骤如下:

k *= c1;
k = rotl32(k, r1);
k *= c2;
h ^= k;
h = rotl32(h, r2);
h = h * m + n;

c1, c2, r1, r2, m, n是固定的常数,通过实验选择,使得哈希函数具有良好的分布性和随机性。

处理尾部(tail)

如果输入数据的长度不是块大小的倍数,剩余的未处理字节(称为尾部)也会影响最终哈希值。
对尾部的字节进行类似的混合处理,但处理量要少得多

最终化(finalization)

h ^= h >> 16;
h *= 0x85ebca6b;
h ^= h >> 13;
h *= 0xc2b2ae35;
h ^= h >> 16;

Demo

#include <stdio.h>
#include <stdint.h>
#include <string.h>#define ROTL32(x, r) ((x << r) | (x >> (32 - r)))uint32_t MurmurHash3_x86_32(const void *key, int len, uint32_t seed) {const uint8_t *data = (const uint8_t *)key;const int nblocks = len / 4;uint32_t h1 = seed;const uint32_t c1 = 0xcc9e2d51;const uint32_t c2 = 0x1b873593;// Bodyconst uint32_t *blocks = (const uint32_t *)(data + nblocks * 4);for (int i = -nblocks; i; i++) {uint32_t k1 = blocks[i];k1 *= c1;k1 = ROTL32(k1, 15);k1 *= c2;h1 ^= k1;h1 = ROTL32(h1, 13);h1 = h1 * 5 + 0xe6546b64;}// Tailconst uint8_t *tail = (const uint8_t *)(data + nblocks * 4);uint32_t k1 = 0;switch (len & 3) {case 3:k1 ^= tail[2] << 16;case 2:k1 ^= tail[1] << 8;case 1:k1 ^= tail[0];k1 *= c1;k1 = ROTL32(k1, 15);k1 *= c2;h1 ^= k1;}// Finalizationh1 ^= len;h1 ^= h1 >> 16;h1 *= 0x85ebca6b;h1 ^= h1 >> 13;h1 *= 0xc2b2ae35;h1 ^= h1 >> 16;return h1;
}int main() {const char *key = "Hello, World!";uint32_t seed = 42;  // A random seed valueuint32_t hash = MurmurHash3_x86_32(key, strlen(key), seed);printf("Hash of '%s' with seed %u is: %u\n", key, seed, hash);/* Hash of 'Hello, World!' with seed 42 is: 1794106050 */return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive分区详细教程

为什么要分区&#xff1f; 为了提高sql的查询效率 比如&#xff1a; select * from orders where create_date20230826; 假如数据量比较大&#xff0c;这个sql就是全表扫描&#xff0c;速度肯定慢。 可以将数据按照天进行分区&#xff0c;一个分区就是一个文件夹&#xff0c;当…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil {return}traversal(root.Lef…

华为HarmonyOS地图服务 5 - 利用UI控件和手势进行地图交互

场景介绍 本章节将向您介绍如何使用地图的手势。 Map Kit提供了多种手势供用户与地图之间进行交互,如缩放、滚动、旋转和倾斜。这些手势默认开启,如果想要关闭某些手势,可以通过MapComponentController类提供的接口来控制手势的开关。 接口说明 以下是地图的控件和手势相…

【LLM多模态】文生视频评测基准VBench

note VBench的16个维度自动化评估指标代码实践&#xff08;待完成&#xff09;16个维度的prompt举例人类偏好标注&#xff1a;计算VBench评估结果与人类偏好之间的相关性、用于DPO微调 文章目录 note一、相关背景二、VBench评测基准概述&#xff1a;论文如何解决这个问题&…

Java免税购物商城:Spring Boot技术实现

第二章 系统开发关键技术 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&#xff09…

RNN的反向传播

目录 1.RNN网络&#xff1a;通过时间反向传播(through time back propagate TTBP) 2.RNN梯度分析 2.1隐藏状态和输出 2.2正向传播&#xff1a; 2.3反向传播&#xff1a; 2.4问题瓶颈&#xff1a; 3.截断时间步分类&#xff1a; 4.截断策略比较 5.反向传播的细节 ​编辑…

植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面

一、介绍 植物病害识别系统。本系统使用Python作为主要编程语言&#xff0c;通过收集水稻常见的四种叶片病害图片&#xff08;‘细菌性叶枯病’, ‘稻瘟病’, ‘褐斑病’, ‘稻瘟条纹病毒病’&#xff09;作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算…

【后端开发】JavaEE初阶—线程的理解和编程实现

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解多线程的知识哟~~~&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【后端开发】JavaEE初阶——计算机是如何工作的&#xff1f;&#xff1f;&#xff1f;-CSDN博客 &#x1f308;感兴趣的小伙…

Tomcat中BIO和NIO的区别(Tomcat)

BIO Tomcat中BIO的模型和理论很简单&#xff0c;例图如下 1.Acceptor线程死循环阻塞接收客户端的打过来的socket请求 2.接收到请求之后打包成一个SocketProcessor&#xff08;Runnable&#xff09;&#xff0c;扔到线程池中读取/写入数据 参数配置 1.Acceptor默认线程是1&#…

【Godot4.x】Mesh相关知识总结

概述 很早之前发布过一篇关于几何体程序生成的文章&#xff0c;当时对于三角面和网格的构造其实还没有特别深入的认识&#xff0c;直到自己脑海里想到用二维数组和点更新的方式构造2D类型的多边形Mesh结构&#xff0c;也意识到在Godot中其实Mesh不仅是3D网格&#xff0c;也可以…

分子动力学工具篇二:Sobtop的安装与使用

文章目录 1. Sobtop的介绍1. Sobtop 的功能和特点2.主要应用场景 2.3.常见问题及解决方法 1. Sobtop的介绍 Sobtop 是一个用于自动生成分子拓扑文件的工具&#xff0c;特别是为 GROMACS 分子动力学模拟准备拓扑结构和参数。它的设计目标是通过自动化过程生成小分子、聚合物或其…

msvcp140.dll0丢失的解决方法,总结6种靠谱的解决方法

再使用计算机的过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个问题可能会影响到我们的正常使用&#xff0c;因此需要及时解决。经过一段时间的学习和实践&#xff0c;我总结了以下六种靠谱的解决方法&#xff0c;希望对大家…

Flask-WTF的使用

组织一个 Flask 项目通常需要遵循一定的结构&#xff0c;以便代码清晰、可维护。下面是一个典型的 Flask 项目结构&#xff1a; my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templat…

【HTTP】构造HTTP请求和状态码

状态码 用于响应中&#xff0c;表示响应的结果如何 正确&#xff1f;错误&#xff1f;什么原因&#xff1f; HTTP 中的状态码都是标准约定好的 200 OK 成功了&#xff0c;一切顺利 在抓包到的响应中 404 Not Found 访问的资源&#xff08;URL 中的路径&#xff09;没找…

数据结构之线性表——LeetCode:707. 设计链表,206. 反转链表,92. 反转链表 II

707. 设计链表 题目描述 707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则…

小程序——生命周期

文章目录 运行机制更新机制生命周期介绍应用级别生命周期页面级别生命周期组件生命周期生命周期两个细节补充说明总结 运行机制 用一张图简要概述一下小程序的运行机制 冷启动与热启动&#xff1a; 小程序启动可以分为两种情况&#xff0c;一种是冷启动&#xff0c;一种是热…

低代码门户技术:构建高效应用的全新方式

什么是低代码门户技术&#xff1f; 低代码门户技术是一种利用低代码平台构建企业门户网站或应用的技术。门户通常是企业内部和外部用户访问信息和应用的集中平台。低代码门户技术通过图形化界面和预置组件&#xff0c;允许用户快速搭建和定制这些门户平台&#xff0c;而无需深…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(3)---通过页面锁屏和关机(含示例代码)

一、预览 实现功能:通过vue标题栏按钮锁屏和关机 1.1 预览 1.2 代码 锁屏代码csharp LockWorkStation() 关机代码chsharp 注意vue代码参数和此参数一致(0/1/2) 方法ExitWindowsEx()

mac电脑打不开rar文件怎么办 rar文件怎么转换成zip并打开

rar文件是一种常见的压缩文件格式&#xff0c;它可以将多个文件或文件夹打包成一个文件&#xff0c;从而节省空间和方便传输。但是&#xff0c;mac系统并没有自带的工具可以直接打开或解压rar文件&#xff0c;那么&#xff0c;mac用户该如何处理rar文件呢&#xff1f; 一、mac电…

初步认识C++模版

前言 在C语言中&#xff0c;我们知道函数的形参需要指定类型&#xff0c;但是在C中&#xff0c;我们可以模版实现各种类型参数的通用函数。 1. 泛型编程 我们通过函数重载实现多种类型的同一作用的函数。如交换函数&#xff1a; void Swap(int& left, int& right) …