murmurhash3算法的go语言实现

MurmurHash的定义

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

MurmurHash的特点

  • 高速度: MurmurHash3 被设计为快速计算哈希值,特别适用于需要高性能的场景。它的实现通常使用了有效的位运算和数值操作,以确保在处理大量数据时仍能保持高效率。
  • 低碰撞: MurMurHash3 128 位版本哈希值是 128 位的,在数据量只有千万级别的情况下,基本不用担心碰撞。
  • 良好的分布性: MurmurHash3 提供了良好的随机性和分布特性。这意味着不同的输入数据在哈希后,其哈希值分布均匀,减少了哈希冲突的可能性。这对于哈希表、散列数据结构等需要快速检索的应用至关重要。
  • 适用性广泛: 由于其速度和分布性,MurmurHash3 可以应用于各种场景,包括分布式系统、缓存系统、数据检验和索引等。它在这些领域中可以提供快速且有效的哈希功能。
  • 可配置性: MurmurHash3 允许用户通过调整种子值和其他参数来定制哈希算法的行为。这种灵活性使得可以根据具体需求进行优化,例如调整哈希长度或者初始化种子值,以适应不同的应用场景和数据集合。
  • 非加密性: MurmurHash3 是一种非加密的哈希函数,它专注于提供高速和良好的分布特性,但不适用于需要强加密保护的数据传输或存储场景。对于这类需求,应使用专门的加密哈希函数。

MurmurHash3的实现原理

初始化参数

  • 种子值(Seed): MurmurHash3 使用一个种子值(seed),这个种子值可以用来初始化哈希计算的状态。不同的种子值将产生不同的哈希结果,这对于哈希表的冲突处理很有用。
  • 常数: 算法中使用一些预定义的常数,这些常数有助于确保哈希的混合和扩散性。

主循环

主循环是 MurmurHash3 哈希计算的核心部分,通常包括以下步骤:

按 4 字节处理数据: 将输入数据按 4 字节(32 位)一组进行处理。如果最后一个块不足 4 字节,则使用特殊处理方式。

混合(Mixing)操作: 对每个 4 字节的块进行混合操作,以确保输入数据的高低位均匀地分布到输出哈希值中。这通常涉及位运算、乘法、异或等操作。

旋转(Rotation)和混合: MurmurHash3 使用了一些位级操作和旋转操作,以增加哈希的随机性和分散性。

最终化

在处理完所有输入数据后,对哈希值进行最终化操作。这些操作通常包括最后一次混合、再次使用常数和种子值进行混合,以确保最终的哈希值具有良好的随机性和分布性。

输出

最终得到的哈希值是一个固定长度(通常是 32 位或 64 位)的整数,可以作为输入数据的唯一标识或索引值使用。

MurmurHash的Go语言实现

const (c1 = 0xcc9e2d51c2 = 0x1b873593r1 = 15r2 = 13m  = 5n  = 0xe6546b64
)func MurmurHash3(key []byte, seed uint32) uint32 {var h1 = seedvar k1 uint32var chunk uint32blocks := len(key) / 4for i := 0; i < blocks; i++ {chunk = uint32(key[i*4]) | uint32(key[i*4+1])<<8 | uint32(key[i*4+2])<<16 | uint32(key[i*4+3])<<24k1 = chunkk1 *= c1k1 = bits.RotateLeft32(k1, r1)k1 *= c2h1 ^= k1h1 = bits.RotateLeft32(h1, r2)h1 = h1*m + n}tail := key[blocks*4:]switch len(tail) {case 3:h1 ^= uint32(tail[2]) << 16fallthroughcase 2:h1 ^= uint32(tail[1]) << 8fallthroughcase 1:h1 ^= uint32(tail[0])h1 *= c1h1 = bits.RotateLeft32(h1, r1)h1 *= c2}h1 ^= uint32(len(key))h1 ^= h1 >> 16h1 *= 0x85ebca6bh1 ^= h1 >> 13h1 *= 0xc2b2ae35h1 ^= h1 >> 16return h1
}func main() {s := "video/BV1yT4y1a7tD/?spm_id_from=333.337.search-card.all.click&vd_source=3cd3e5853cdff0baa992698bfe4286f6"//转换为byte类型arrayOfString := []byte(s)resultTen := MurmurHash3(arrayOfString, 0)fmt.Println(resultTen)
}

代码解析

常量定义

  • c1, c2: 用于混合和乘法的常数。
  • r1, r2: 用于左移位操作的位移量。
  • m, n: 用于混合操作的常数。

MurmurHash3函数

  • MurmurHash3函数接受两个参数:key是待哈希的字节数组,seed是哈希种子,用于初始化哈希值。
  • h1 是哈希结果的中间值,初始化为seed。
  • k1 是每个处理的块的哈希键。
  • chunk 是每次处理的四个字节的数据块。

哈希计算过程

处理数据:

  • 将输入的字节数组分成4字节的块,按顺序处理。
  • 计算每个块的哈希键 k1,应用一系列乘法、位移和异或操作。
  • 将结果与中间值 h1 进行混合和旋转操作。
  • 处理剩余不足4字节的部分(尾部):

处理剩余尾部:

如果输入的字节数组长度不是4的整数倍,处理剩余的部分。这部分通过一系列的位移、乘法和异或操作来处理,确保整个字节数组都被考虑在内。

最终对哈希值进行最后的混合和压缩,确保输出的哈希值分布均匀和具有良好的性质。

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

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

相关文章

网络编程-TCP/IP

网络概述 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机组合在一起。 每层实现不同的功能&#xff0c;其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务&#xff0c;同时使用下层提供的服务 网络体系结构…

SpringMVC注解全解析:构建高效Web应用的终极指南 (上)

SpringMVC 是一个强大的 Web 框架&#xff0c;广泛应用于 Java Web 开发中。它通过注解简化了配置&#xff0c;增强了代码的可读性。本文将全面解析 SpringMVC 中常用的注解及其用法&#xff0c;帮助你构建高效的 Web 应用。 一. MVC介绍 MVC 是 Model View Controller 的缩写…

数字通云平台 智慧政务OA PayslipUser SQL注入漏洞复现

0x01 产品简介 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术,为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平,推动电子政务向更高层次发展。 0x02 漏洞概述 数字通云平台 智慧政务OA Paysli…

在vue2中引入一个js文件, 在模版中不能使用js中的变量解决

在 Vue 2 中&#xff0c;如果你引入一个 JavaScript 文件&#xff0c;并希望在模板中使用该文件中的变量&#xff0c;通常有几个常见的问题和解决方法&#xff1a; 1. 作用域问题 在 Vue 模板中&#xff0c;只能访问到 Vue 实例中的数据和方法&#xff0c;而无法直接访问外部…

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

差分进化(Differential Evolution)算法

一、差分进化&#xff08;Differential Evolution&#xff09;算法的起源 差分进化算法&#xff08;DE&#xff09;是一种基于群体的进化算法&#xff0c;由Rainer Storn和Kenneth Price在1995年提出。它是一种全局优化算法&#xff0c;适用于处理多种优化问题&#xff0c;包括…

PostgreSQL的引号、数据类型转换和数据类型

一、单引号和双引号&#xff08;重要&#xff09;&#xff1a; 1、在mysql没啥区别 2、在pgsql中&#xff0c;实际字符串用单引号&#xff0c;双引号相当于mysql的,用来包含关键字&#xff1b; -- 单引号&#xff0c;表示user_name的字符串实际值 insert into t_user(user_nam…

浏览器跨tab页面通信方式总结

需求&#xff1a; 浏览器不同 tab 标签页之间是独立的&#xff0c; 如果要通信必须通过特殊手段来实现跨标签页通信。 1.StorageEvent 事件 当一个标签页 localStorage 变化时&#xff08;sessionStorage 无效&#xff09;&#xff0c;同源下另一个或其他所有标签页使用 DO…

python多级表头汇总

需求&#xff1a;将图一的数据展示为图二样式 图一&#xff1a; 图二&#xff1a; 图一具体的Excel截图 图二具体样式 python解决办法&#xff1a; # 导入 pandas 库&#xff0c;用于数据处理 import pandas as pd# 加载 Excel 文件 file_path 多级表头读取实例.xl…

科研绘图系列:R语言circos图(circos plot)

介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…

【BUG】已解决:SyntaxError invalid syntax

SyntaxError invalid syntax 目录 SyntaxError invalid syntax 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…

C?C++?

c和C的区别主要是&#xff1a; 1、语言使用难度不同C难度大于C#大于C语言。 2、面向的对象不同C 语言是面向过程的&#xff0c;而 C 是面向对象的&#xff0c;C# 是一种完全面向对象的语言。 3、函数形式不同C 语言有标准的函数库&#xff0c;它们松散的&#xff0c;只是把功能…

图书馆定位导航:RFID、VR与AR技术在图书馆中的应用

图书馆作为知识的宝库&#xff0c;承载着无数求知者的梦想与期待&#xff0c;随着馆藏书籍数量的激增与图书馆布局的日益复杂&#xff0c;读者在寻找目标书籍往往有许多困难。传统的索引号查询方式虽能提供书籍的基本信息&#xff0c;但在寻找过程中&#xff0c;因不熟悉图书馆…

【Android】使用视图绑定ViewBinding来代替findViewById

文章目录 介绍作用用法开启ViewBinding功能自动生成绑定类在Activity中使用访问视图控件 区别 介绍 ViewBinding 是 Android 开发中的一个功能&#xff0c;它简化了访问视图的过程&#xff0c;避免了使用 findViewById 的繁琐步骤。它通过生成与布局文件相对应的绑定类&#xf…

CentOS 7 安装Jenkins2.346.1(war方式安装)

既然想要安装Jenkins&#xff0c;肯定是先要从官网解读所需环境配置信息&#xff0c;如需了解更多自行查阅 https://www.jenkins.io/doc/book/installing/linux/ JDK17&#xff0c;Maven3.9 安装 先从官网分别下载JDK17与Maven3.9 下载好之后上传至服务器、并解压&#xff1a…

算法学习day13(动态规划)

一、打家劫舍III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 …

ubuntu 24 PXE Server (bios+uefi) 批量部署系统

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

dev c++ 添加osg包含目录失败

在dev c 中添加osg的包含目录&#xff1b; 编译程序&#xff0c;出现下图错误&#xff1b; 打开出错文件&#xff0c;修改编码为UTF-8&#xff0c; 错误还是没有消除&#xff1b; 根据资料&#xff0c;osg是基于opengl开发的&#xff1b;不过我也没在osg的目录下看到opengl的头…

2024-07-19 Unity插件 Odin Inspector10 —— Misc Attributes

文章目录 1 说明2 其他特性2.1 CustomContextMenu2.2 DisableContextMenu2.3 DrawWithUnity2.4 HideDuplicateReferenceBox2.5 Indent2.6 InfoBox2.7 InlineProperty2.8 LabelText2.9 LabelWidth2.10 OnCollectionChanged2.11 OnInspectorDispose2.12 OnInspectorGUI2.13 OnIns…

Training for Stable Diffusion

1.Training for Stable Diffusion 笔记来源&#xff1a; 1.Denoising Diffusion Probabilistic Models 2.最大似然估计(Maximum likelihood estimation) 3.Understanding Maximum Likelihood Estimation 4.How to Solve ‘CUDA out of memory’ in PyTorch 1.1 Introduction …