0

0

一文搞懂Hash算法以及应用场景

王林

王林

发布时间:2023-04-13 11:55:02

|

2942人浏览过

|

来源于51CTO.COM

转载

一、什么是哈希算法

哈希和散列都来源于单词hash,前者是音译,后者是意译。是一种可以将任意长度的二进制值映射为固定长度二进制值的算法,映射后固定长度的二进制值被称为哈希值。一个优秀的哈希算法需要满足以下几点要求:

不能从哈希值反向推导出原始数据;

对输入数据非常敏感,一个bit不同就会导致哈希值非常不一样;

散列冲突的概率要很小;

哈希算法的计算过程要足够简单高效,即使原始数据很长,也能很快得到哈希值;

二、哈希算法的使用场景

2.1 安全加密

比较常见的哈希加密算法有MD5(MD5 Message-Digest Algorithm, MD5消息摘要算法)和SHA(Secure Hash Algorithm, 安全散列算法)。

不能从哈希值密文反推出明文密码,且散列冲突概率比较小,这两点确保了哈希算法作为安全加密手段的可靠性。

为什么哈希算法不能完全避免散列冲突,只能尽量减少?

鸽巢原理告诉我们,11个鸽子飞进10个鸽子笼,那么必定有一个鸽子笼里面有2只及以上的鸽子。那么散列值是固定长度的,也就决定了散列值可以被穷举,但是理论上原始数据是无穷无尽的,因此必定有可能会导致散列冲突。

这种应用场景用到了哈希算法的特点1和3,其中3保证了密码被正向破解的难度很大(以MD5为例,散列值长度为128位,有2^128个不同的哈希值,很难被破解)。

安全领域没有绝对的安全,虽然MD5很难被破解,但是还是有办法被破解的,比如使用彩虹表匹配可以很轻松地破解常见密码。

所以一般我们会使用加盐的哈希算法来进行安全加密,加盐的方法需要严格保密,如此让破解的难度和成本都大大增加。

2.2 唯一标志

我们在校验两个文件是否一样的时候,是不能简单地通过文件名来进行判断的。因为同名文件的存在太常见了。

我们可以从大文件中按照特定的规则取一些二进制数据,利用哈希算法得出哈希值作为该文件的唯一标志。如此相同的文件必定具有相同的哈希值,也就是相同的唯一标志;不同的文件在很大概率上是具有不同的哈希值唯一标志的;

即使真的遇到了散列冲突,我们可以再详细比对两个文件的全部二进制数据,进一步判断它们是否是同一个文件,这个事件发生的概率太小了。但是这种方案既保证了高效,又保证了可靠。

这种应用场景用到了哈希算法的特点2和3。

Tome
Tome

先进的AI智能PPT制作工具

下载

2.3 数据校验

在P2P下载协议中,我们会从不同的机器上下载同一部电影的不同部分,然后在自己的机器上将电影组装起来。如果这其中某个部分的电影下载过程中出了错误或者内容被篡改了,就可能导致下载出错或者中病毒。

因此,我们先对所有部分进行hash计算,并保存在种子文件中。等到所有部分下载完成,我们对所有部分进行哈希计算得到哈希值,再和种子文件中的进行比较,以此来校验文件是否完整。

这种应用场景用到了哈希算法的特点2和4。

2.4 散列函数

这种场景在前面讲过散列表的时候就已经介绍了。这种场景下,对特点1要求不是很高,特点2的要求是散列值要尽量均匀分布,特点3也在一定程度上可以接受冲突,使用开放寻址法和拉链法就可以解决,就是特点4要求高一点,需要追求性能。

2.5 负载均衡

负载均衡的算法有很多,比如轮询、随机、加权轮询等,但是目标是要实现一个会话粘滞的负载均衡算法,即同一个客户端在一个会话期间所有的请求都是路由到同一台服务器的。

我们可以将客户端的IP或者会话ID进行哈希计算,得到的哈希值与服务器个数进行取模运算,最终得到的值就是需要路由的服务器,这样就能实现会话粘滞的目的。

2.6 数据分片

当我们需要处理海量数据的时候,单台服务器无法加载和计算如此海量的数据,那么我们就需要将海量数据均匀地分给N台服务器进行并行计算,如何将数据均匀地分给N台服务器呢?

我们对数据进行哈希计算,用得到的哈希值对服务器个数N取模,相同结果的数据会被分到相同的服务器上,交给这台服务器处理。N台服务器并行处理海量数据,最终再将结果合并起来即可。

2.7 分布式存储

将海量数据存储到分布式缓存或者分布式数据库中,借用的思想和上面的数据分片是类似的。只不过,当原先设定好的服务器数量不够的时候该如何处理呢?

并不是简单地加几台机器就能解决的,这会破坏哈希值的取模运算,导致缓存穿透,引起雪崩效应。同理,当某个机器故障被移除时也会导致相同的问题。这个时候需要借助一致性哈希算法来解决这个问题。

一致性哈希算法简单地说就是构造一个hash环,环上有2^32个节点,将服务器IP和文件都hash计算映射到对应的节点上。所有文件顺时针遇到的第一个服务器就作为自己存放的服务器。如此,当增加或者删除某个服务器的时候,影响的文件个数就可控,不会造成全局雪崩。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

一文搞懂Hash算法以及应用场景

hash环

但是,在一定概率上,服务器IP在映射到hash环上时,会出现hash环偏斜的问题,此时会导致服务器上文件分布极其不均匀,退化为一开始在增删服务器时容易造成雪崩效应的场景。

一文搞懂Hash算法以及应用场景

hash环的偏斜

我们可以人为地为这些服务器增加若干虚拟节点,使得所有服务器节点在hash环上分布均匀。

一文搞懂Hash算法以及应用场景

带虚拟节点的hash环

三、总结

Hash算法的使用场景远远不止上述这些,还有比如CRC校验。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
深入剖析redis教程
深入剖析redis教程

共55课时 | 8.3万人学习

麦子学院深入浅出 redis 视频教程
麦子学院深入浅出 redis 视频教程

共20课时 | 4.5万人学习

传智播客redis基础视频教程
传智播客redis基础视频教程

共13课时 | 5.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号