Hash【散列函数】
一、引言
Hash在开发中的应用非常广泛,包括文件完整性校验,数字签名,鉴权等方面,都有一定程度的应用,而Hash分支衍生的数据结构也是很重要的一部分,这篇文章就记录一下Hash的学习过程。
二、Hash【散列函数】
定义:把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。
- 哈希算法:将任意长度的二进制值串映射为固定长度的二进制值串。
- 哈希值:通过原始数据映射之后得到的二进制值串。
PS:Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。
常见应用:文件完整性校验,数字签名,鉴权等方面
结构分析:
PS:之所以使用"头插法",把后面Hash碰撞的元素放在头节点,是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。
插入数据步骤
- 1、通过函数Hash("有梦想的肥宅")得到2,即在索引位2的地方插入name=“有梦想的肥宅”对应的数据
- 2、通过函数Hash("阿靓")得到4,即在索引位4的地方插入name=“阿靓”对应的数据
- 3、通过函数Hash("阿肥")得到2,即在索引位2的地方插入name=“阿肥”对应的数据,但是此时索引位置上面已经有数据了,这种情况称之为”Hash碰撞“,并使用“头插法”来插入链表
查询数据步骤
比如使用”有梦想的肥宅“关键字来查询数据:
- 1、通过函数Hash("有梦想的肥宅")得到2,即去索引位置为2的地方去找数据
- 2、拿到数组索引位置2的元素【链表】,比较链表内部第一个元素的name字段,发现不是我们需要找的数据,继续向后比较
- 3、取出链表内部第二个元素的name字段,比较后发现是我们需要查询的数据,此时查询结束,返回数据内容
三、Hash使用场景和优劣性分析
使用场景
我们在数据加密传输时经常会用到一些hash算法,且hash在文件完整性校验,数字签名,鉴权等方面都占有很重要的地位。如果作为数据查询索引的话,优势劣势都很明显,不过像是MySQL这种主流的数据库并没有采用Hash作为索引生成的工具,我们看看下面的优劣性分析就知道了。
常见应用
- MD5信息摘要算法
- SHA-1安全散列算法
- 文件完整性校验,数字签名,鉴权等
优势
- 很难找到逆向规律
- 提高存储空间的利用率
- 提高数据的查询效率【如用作索引或数据定位时,对关键字key进行一次hash计算就可以定位出数据存储的位置,效率相当高】
劣势
- 仅能满足 “=”,“IN”,不支持范围查询
- hash冲突过多时,也会对数据定位效率造成影响
参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律