当前位置: 首页 > news >正文

MurmurHash算法

MurmurHash:(multiply and rotate) and (multiply and rotate) Hash,乘法和旋转的hash 算法。

一、哈希函数

散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。

散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。

该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。

特点:

加密:加密存在数据库中的密码(password)字符串,由于散列算法所计算出来的散列值(Hash Value)具有不可逆(无法逆向演算回原本的数值)的性质,因此可有效的保护密码。

压缩:把任意长度的输入通过散列算法变换成固定长度的输出。

场景:

保护资料、确保传递真实的信息、散列表、错误校正、语音识别、信息安全...

常见哈希算法:

MD系列(MD5)、SHA系列(SHA-1)、CRC,甚至JDK hashCode()也是哈希算法的一种。可以将他们分成三代:

第一代:SHA-1(1993),MD5(1992),CRC(1975),Lookup3(2006)

第二代:MurmurHash(2008)

第三代:CityHash, SpookyHash(2011)

分类可分为加密型、非加密型:

加密型:MD系列(MD5)、SHA系列(SHA-1)

非加密型:CRC、MurmurHash

二、MurmurHash

MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby在2008年发明,并出现了多个变种,都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。

特点:

1.快 ,MurMurHash3 比 MD5 快

2.低碰撞,MurMurHash3 128 位版本哈希值是 128 位的,跟 MD5 一样。128 位的哈希值,在数据量只有千万级别的情况下,基本不用担心碰撞。

3.高混淆,散列值比较“均匀”,如果用于哈希表,布隆过滤器等, 元素就会均匀分布。

广泛应用于各开源产品,Java 界中 Redis,Memcached,Cassandra,Hadoop,HBase,Lucene,spark,nginx,常见的大数据库底层,都使用了这个算法作为底层的存储算法。

MurMurHash3 128 位版本的速度是 MD5 的十倍。有趣的是,MurMurHash3 生成 32 位哈希的用时比生成 128 位哈希的用时要长。原因在于MurMurHash3_128 针对现代 x64 平台cpu进行了优化。

三、MurmurHash的使用

Java版:google guava 包中提供了使用工具类:

<groupId>com.google.guava</groupId><artifactId>guava</artifactId>
<version>30.1.1-jre</version>
package com.joker.cloud.linserver.conf.murmur;import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;import java.nio.charset.StandardCharsets;/*** MurmurHashTest** @author joker* @version 1.0* 2023/3/7 14:29**/public class MurmurHashTest {public static void main(String[] args) {String base64 = "CSHyrMyg087o3JWW7EWn+llHweWg1OVpxupHegjYREjousvZYdaWMCDWk1nEvDEFpzdsxSBunEPdUlgdu4+lCspuK32t68ruwKCU4KOM8ZIGXjjp10/lMrymjdYYLaIiAhdAHeOfGz+RfYUlJXGn4iV0tahHCGeh9//Ap6Mv6nhxxrbxWwYDnYC6PRvdoMpwaVydfGfValGk+ygZnnr84uAzPytXqGzF23M6gNWtFT29yTMdK3vZaUtkE3AaybRO0DLBkBnqeWXnBNqFQHWnHg==";String hash128String = getHexHash128String(base64);System.out.println(hash128String);}public static String getHexHash128String(String str) {HashFunction hashFunction = Hashing.murmur3_128();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}
}

性能测试:

package com.joker.cloud.linserver.conf.murmur;import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;import java.nio.charset.StandardCharsets;/*** MurmurHashTest** @author joker* @version 1.0* 2023/3/7 14:29**/public class MurmurHashTest {public static void main(String[] args) {String base64 = "CSHyrMyg087o3JWW7EWn+llHweWg1OVpxupHegjYREjousvZYdaWMCDWk1nEvDEFpzdsxSBunEPdUlgdu4+lCspuK32t68ruwKCU4KOM8ZIGXjjp10/lMrymjdYYLaIiAhdAHeOfGz+RfYUlJXGn4iV0tahHCGeh9//Ap6Mv6nhxxrbxWwYDnYC6PRvdoMpwaVydfGfValGk+ygZnnr84uAzPytXqGzF23M6gNWtFT29yTMdK3vZaUtkE3AaybRO0DLBkBnqeWXnBNqFQHWnHg==";String hash128String = getHexHash128String(base64);System.out.println(hash128String);long l = System.nanoTime();int num = 10000000;for (int i = 0; i < num; i++) {String hexHashString1 = getHexHash128String(base64);}long time = System.nanoTime() - l;System.out.println(num+"条数据,一共花费时间:" + time / (1000 * 1000 * 1000) + "秒");long ns = time / (num);System.out.println(num+"条数据,每条数据花费时间:" + ns + "纳秒");}public static String getHexHash128String(String str) {HashFunction hashFunction = Hashing.murmur3_128();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}
}

32位与128位:

MurmurHash 算法提供了两种长度的哈希值,一种是 32bits,一种是 128bits。为了让最终生成的短网址尽可能短,可以选择 32bits 的哈希值。

package com.joker.cloud.linserver.conf.murmur;import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;import java.nio.charset.StandardCharsets;/*** MurmurHashTest** @author joker* @version 1.0* 2023/3/7 14:29**/public class MurmurHashTest {public static String getHexHash32String(String str) {HashFunction hashFunction = Hashing.murmur3_32();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}public static String getHexHash128String(String str) {HashFunction hashFunction = Hashing.murmur3_128();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}public static Long getHexHash32Long(String str) {HashFunction hashFunction = Hashing.murmur3_32();return hashFunction.hashString(str, StandardCharsets.UTF_8).padToLong();}}

常用于长链接转短链接:

实现思路是通过哈希算法生成短网址。采用计算速度快、冲突概率小的 MurmurHash 算法,并将计算得到的 10 进制数,转化成 62 进制表示法,进一步缩短短网址的长度。对于哈希算法的哈希冲突问题,通过给原始网址添加特殊前缀字符,重新计算哈希值的方法来解决。

长链接转短链接-CSDN博客

相关文章:

MurmurHash算法

MurmurHash&#xff1a;(multiply and rotate) and (multiply and rotate) Hash&#xff0c;乘法和旋转的hash 算法。 一、哈希函数 散列函数&#xff08;英语&#xff1a;Hash function&#xff09;又称散列算法、哈希函数&#xff0c;是一种从任何一种数据中创建小的数字“…...

CSRF靶场实战

DVWA靶场链接&#xff1a;https://pan.baidu.com/s/1eUlPyB-gjiZwI0wsNW_Vkw?pwd0b52 提取码&#xff1a;0b52 DVWA Low 级别打开靶场&#xff0c;修改密码 复制上面的 url&#xff0c;写个简单的 html 文件 <html <body> <a hrefhttp://127.0.0.1/DVWA/vulne…...

小程序性能优化

背景 在开发小程序的过程中我们发现&#xff0c;小程序的经常会遇到性能问题&#xff0c;尤其是在微信开发者工具的时候更是格外的卡&#xff0c;经过排查发现&#xff0c;卡顿的页面有这么多的js代码需要加载&#xff0c;而且都是在进入这个页面的时候加载&#xff0c;这就会…...

C++拿几道题练练手吧

第 1 题 【 问答题 】 • 最短路径问题 平面上有n个点(n<100)&#xff0c;每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。 若有连线&#xff0c;则表示可从一个点到达另一个点&#xff0c;即两点间有通路&#xff0c;通路的距离为两点间的直线距离。现在的任务…...

【国产MCU】-CH32V307-I2C控制器

I2C控制器 文章目录 I2C控制器1、I2C模块介绍2、I2C驱动API介绍3、I2C使用实例3.1 主模式3.1.1 主设备发送模式和主设备接收模式3.1.2 DMA方式发送3.2 从模式内部集成电路总线(I2C)广泛用在微控制器和传感器及其他片外模块的通讯上,它本身支持多主多从模式,仅仅使用两根线(…...

k8s pod理论

一、Pod概述 1、Pod的定义 Pod是K8S中创建和管理的最小单位。 2、一个Pod至少包含多少容器 1个pause容器&#xff08;基础容器/父容器/根容器&#xff09;和 1个或者多个应用容器&#xff08;业务容器&#xff09; 通常一个Pod最好只包含一个应用容器&#xff0c;一个应用容…...

智慧应急:构建全方位、立体化的安全保障网络

一、引言 在信息化、智能化快速发展的今天&#xff0c;传统的应急管理模式已难以满足现代社会对安全保障的需求。智慧应急作为一种全新的安全管理模式&#xff0c;旨在通过集成物联网、大数据、云计算、人工智能等先进技术&#xff0c;实现对应急事件的快速响应、精准决策和高…...

国际黄金价格是什么?和黄金价格有何区别?

黄金是世界上最珍贵的贵金属之一&#xff0c;其价值被无数人所垂涎。而国际黄金价格作为市场上的参考指标&#xff0c;直接影响着黄金交易的买卖。那么国际黄金价格到底是什么&#xff0c;与黄金价格又有何区别呢&#xff1f;本文将为您详细解答。 国际黄金价格是指以美元计量的…...

React入门简介

React简介 react是Facebook用来创建用户界面的js库。React不是一个MVC框架&#xff0c;而是一个用于构建组件ui库&#xff0c;是一个前端界面开发工具&#xff0c;所以很多人认为React是MVC中的V&#xff08;视图&#xff09;。React的存在能够很好的解决‘构建随着时间数据不断…...

强化学习_06_pytorch-PPO实践(Hopper-v4)

一、PPO优化 PPO的简介和实践可以看笔者之前的文章 强化学习_06_pytorch-PPO实践(Pendulum-v1) 针对之前的PPO做了主要以下优化&#xff1a; batch_normalize: 在mini_batch 函数中进行adv的normalize, 加速模型对adv的学习policyNet采用beta分布(0~1): 同时增加MaxMinScale …...

Scala Intellij编译错误:idea报错xxxx“is already defined as”

今天写scala代码时,Idea报了这样的错误&#xff0c;如下图所示&#xff1a; 一般情况下原因分两种&#xff1a; 第一是我们定义的类或对象重复多次出现&#xff0c;编译器无法确定使用哪个定义。 这通常是由于以下几个原因导致的&#xff1a; 重复定义&#xff1a;在同一个文件…...

面试笔记系列五之MySql+Mybaits基础知识点整理及常见面试题

myibatis执行过程 1读取MyBatis的配置文件。 mybatis-config.xml为MyBatis的全局配置文件&#xff0c;用于配置数据库连接信息。 2加载映射文件。映射文件即SQL映射文件&#xff0c;该文件中配置了操作数据库的SQL语句&#xff0c;需要在MyBatis配置文件mybatis-config.xml中…...

掌握Pillow:Python图像处理的艺术

掌握Pillow&#xff1a;Python图像处理的艺术 引言Python与图像处理的概述Pillow库基础导入Pillow库基本概念图像的打开、保存和显示 图像操作基础图像的剪裁图像的旋转和缩放色彩转换和滤镜应用文字和图形的绘制 高级图像处理图像的合成与蒙版操作像素级操作与图像增强复杂图形…...

React最常用的几个hook

React最常用的几个Hook包括&#xff1a;useState、useEffect、useRef以及useContext。 useState&#xff1a; 用于在函数组件中添加状态管理。它返回一个数组&#xff0c;第一个元素是当前状态的值&#xff0c;第二个元素是更新状态的函数。在使用时&#xff0c;可以通过解构赋…...

自然语言处理Gensim入门:建模与模型保存

文章目录 自然语言处理Gensim入门&#xff1a;建模与模型保存关于gensim基础知识1. 模块导入2. 内部变量定义3. 主函数入口 (if __name__ __main__:)4. 加载语料库映射5. 加载和预处理语料库6. 根据方法参数选择模型训练方式7. 保存模型和变换后的语料8.代码 自然语言处理Gens…...

Windows 10中Visual Studio Code(VSCode)无法自动打开终端的解决办法

1.检查设置&#xff1a; 打开VSCode。点击左侧菜单栏的“文件”&#xff08;File&#xff09;。选择“首选项”&#xff08;Preferences&#xff09;。点击“设置”&#xff08;Settings&#xff09;。在搜索框中输入“shell”&#xff0c;然后点击“settings.json”进行编辑。…...

python dictionary 字典中的内置函数介绍及其示例

Python字典内置方法&#xff1a; 本文介绍了Python字典&#xff08;dictionary&#xff09;中的内置函数及其用法示例。字典是Python中非常常用的一种数据结构&#xff0c;它允许我们通过键&#xff08;key&#xff09;来快速查找、添加、修改或删除值&#xff08;value&#…...

pdf转word文档怎么转?分享4种转换方法

pdf转word文档怎么转&#xff1f;在日常工作中&#xff0c;我们经常遇到需要将PDF文件转换为Word文档的情况。无论是为了编辑、修改还是为了重新排版&#xff0c;将PDF转为Word都显得尤为重要。那么&#xff0c;PDF转Word文档怎么转呢&#xff1f;今天&#xff0c;就为大家分享…...

深度测试:指定DoC ID对ES写入性能的影响

在[[使用python批量写入ES索引数据]]中已经介绍了如何批量写入ES数据。基于该流程实际测试一下指定文档ID对ES性能的影响有多大。 一句话版 指定ID比不指定ID的性能下降了63%&#xff0c;且加剧趋势。 以下是测评验证的细节。 百万数据量 索引默认使用1分片和1副本。 指定…...

【JGit】 AddCommand 新增的文件不能添加到暂存区

执行git.add().addFilepattern(".").setUpdate(true).call() 。新增的文件不能添加到暂存区&#xff0c;为什么&#xff1f; 在 JGit 中&#xff0c;setUpdate(true) 方法用于在调用 AddCommand 的 addFilepattern() 方法时&#xff0c;将已跟踪文件标记为需要更新。…...

ROS Action从入门到精通:一个自定义Timer.action的完整开发、编译与调试避坑指南

ROS Action深度实战&#xff1a;从Timer.action开发到高级调试技巧全解析 在机器人开发中&#xff0c;任务执行往往需要长时间运行且状态可监控。想象一下让机器人移动到指定位置的任务——如果使用传统的服务调用&#xff0c;开发者无法获知移动进度&#xff0c;也无法中途取消…...

合同管理系统哪个好?2026 年选型指南

2026年企业数字化转型进入深水区&#xff0c;合同作为企业经营核心法律文件&#xff0c;早已不再是简单存档保管的纸质资料。合同起草慢、审批堵、签署难、履约乱、归档杂、风险高、数据孤岛等痛点&#xff0c;正持续吞噬企业利润、增加合规隐患。市面上合同管理系统五花八门&a…...

避坑指南:Unity ShaderGraph做旋涡效果,别忘了设置Transparent和Alpha通道!

Unity ShaderGraph旋涡效果实战&#xff1a;透明通道与遮罩的黄金法则 当你在Unity中第一次看到那些酷炫的旋涡特效时&#xff0c;是否也曾被它们流畅的透明过渡和动态旋转所吸引&#xff1f;作为视觉表现的关键元素&#xff0c;旋涡效果广泛应用于游戏中的传送门、魔法阵、能量…...

避开时序坑!用51单片机读取DHT22温湿度数据的5个关键细节与代码优化

避开时序坑&#xff01;用51单片机读取DHT22温湿度数据的5个关键细节与代码优化 当你用51单片机驱动DHT22温湿度传感器时&#xff0c;是否遇到过数据偶尔跳变、读取失败甚至完全无响应的情况&#xff1f;这些问题往往源于对DHT22严苛时序要求的忽视。本文将深入剖析5个关键细节…...

芯驰E3-gateway开发板Windows环境搭建保姆级教程(含IAR配置与常见坑点)

芯驰E3-gateway开发板Windows环境搭建全流程解析与实战避坑指南 拿到芯驰E3-gateway开发板的第一天&#xff0c;我对着官方文档折腾了整整8小时——环境变量报错、IAR工程无法生成、烧录后芯片不响应...这些坑几乎让项目还没开始就濒临放弃。如果你也正在经历这种痛苦&#xf…...

别只看C8T6了!深入聊聊STM32F103C6T6:它的32K Flash到底够不够用?

别只看C8T6了&#xff01;深入聊聊STM32F103C6T6&#xff1a;它的32K Flash到底够不够用&#xff1f; 在芯片价格波动的市场环境下&#xff0c;许多嵌入式开发者开始重新审视那些被忽视的低配型号。STM32F103C6T6就是这样一颗被低估的芯片——它拥有与C8T6相同的Cortex-M3内核&…...

Harness 中的动态批处理:合并多个轻量请求

Harness 中的动态批处理:合并多个轻量请求,让云原生控制平面性能提升3倍 引言 痛点引入 如果你负责过云原生DevOps平台、微服务控制平面或者大模型推理服务的性能优化,一定遇到过这样的窘境: 平台QPS刚刚突破10万,API网关的CPU就已经打满了,排查下来发现70%的请求都是小…...

别再傻傻分不清了!5分钟搞懂.NET、C#和ASP.NET到底啥关系(附学习路线图)

微软技术栈入门指南&#xff1a;从零构建.NET技术认知体系 第一次接触微软技术栈时&#xff0c;那些以".NET"结尾的名词确实让人眼花缭乱。记得我刚开始学习时&#xff0c;曾花了整整两周时间才理清这些概念之间的关系。本文将用最直观的方式帮你建立清晰的技术认知框…...

WPF自定义控件实战:从用户吐槽到优雅实现——我的DateTimePicker开发踩坑记

WPF自定义控件实战&#xff1a;从用户吐槽到优雅实现——我的DateTimePicker开发踩坑记 那天产品经理拍着桌子说&#xff1a;"我们的用户需要精确到秒的时间选择&#xff01;"我看了看系统里那个老旧的DatePicker&#xff0c;只能显示年月日&#xff0c;心里默默叹了…...

手把手教你用CarMaker 10.2和Matlab R2021a搭建联合仿真环境(附避坑指南)

从零开始构建CarMaker与Simulink联合仿真环境的完整指南 当车辆动力学仿真遇到控制系统设计&#xff0c;CarMaker与Simulink的联合仿真环境就像给工程师装上了涡轮增压器。这个强大的组合允许你在高度逼真的虚拟测试环境中验证控制算法&#xff0c;而无需等待物理原型。想象一下…...