什么是哈希函数

目录

[🧩 一、什么是哈希函数(Hash Function)?](#🧩 一、什么是哈希函数(Hash Function)?)

[🧠 二、哈希函数的基本特性](#🧠 二、哈希函数的基本特性)

[🔐 三、常见的哈希函数类型](#🔐 三、常见的哈希函数类型)

[🔧 四、常见使用场景](#🔧 四、常见使用场景)

[1️⃣ ✅ 密码存储(加密安全场景)](#1️⃣ ✅ 密码存储(加密安全场景))

[2️⃣ ✅ 数据完整性校验](#2️⃣ ✅ 数据完整性校验)

[3️⃣ ✅ 哈希表(Hash Table)](#3️⃣ ✅ 哈希表(Hash Table))

[4️⃣ ✅ 数字签名 / 电子签名](#4️⃣ ✅ 数字签名 / 电子签名)

[5️⃣ ✅ 区块链和比特币](#5️⃣ ✅ 区块链和比特币)

[6️⃣ ✅ 版本控制系统(如 Git)](#6️⃣ ✅ 版本控制系统(如 Git))

[🧪 五、一个直观例子(SHA-256)](#🧪 五、一个直观例子(SHA-256))

[⚠️ 六、哈希函数不是加密!](#⚠️ 六、哈希函数不是加密!)

[✅ 七、总结表](#✅ 七、总结表)


我们来系统且通俗地讲一讲哈希函数(Hash Function)是什么、它的核心特性、常见类型,以及各种使用场景


🧩 一、什么是哈希函数(Hash Function)?

哈希函数 是一种将任意长度的数据 (如字符串、文件、图片等)映射为固定长度的输出值的函数,这个输出值称为"哈希值"(hash value)或"摘要"(digest)。

📌 哈希函数的数学表达式:
h(x)=y

其中 x 是输入,h 是哈希函数,y 是输出(固定长度)


🧠 二、哈希函数的基本特性

特性 含义
确定性 同样的输入必须返回相同的输出
高效性 计算速度快,即使是大文件也能迅速处理
固定长度输出 不论输入多大,输出长度不变(如 SHA-256 总是输出 256 位)
雪崩效应 输入只要有一点变化,输出就会完全不同
抗碰撞性 找到两个不同的输入 x≠yx \neq yx=y,使得 h(x)=h(y)h(x) = h(y)h(x)=h(y) 很困难
不可逆性 从输出值很难(实际上不可能)推回原始输入(单向函数)

🔐 三、常见的哈希函数类型

哈希函数 输出长度 安全性 用途
MD5 128 位 ❌不安全(已被破解) 文件校验、老系统
SHA-1 160 位 ❌不安全(已被破解) 旧版加密协议
SHA-256 256 位 ✅安全 密码加密、数字签名、区块链
SHA-3 可变 ✅安全(新标准) 替代 SHA-2 的新方案
CRC32 32 位 ⚠️非加密安全 数据完整性检查

🔧 四、常见使用场景

1️⃣ ✅ 密码存储(加密安全场景)

  • 原密码不能明文保存,使用哈希函数加密:
bash 复制代码
用户输入密码 → 哈希处理 → 存储哈希值
  • 验证登录时再次哈希用户输入,与数据库中的哈希值对比。

常用算法:SHA-256、bcrypt(加盐)、PBKDF2、Argon2 等


2️⃣ ✅ 数据完整性校验

  • 用哈希值确认文件是否被篡改:
bash 复制代码
下载文件时,网站同时提供文件的 SHA-256 值。
  • 下载后你用工具生成自己的哈希值对比,判断是否一致。

常用工具:md5sumsha256sum


3️⃣ ✅ 哈希表(Hash Table)

  • 在编程中,哈希函数用来快速查找数据:
bash 复制代码
Map<String, Integer> map = new HashMap<>();
  • 键通过哈希函数转化为数组索引,提高查找效率(接近 O(1))

使用语言层级的哈希函数:Python 的 hash(), Java 的 hashCode()


4️⃣ ✅ 数字签名 / 电子签名

  • 数据先进行哈希,然后再用私钥对哈希值进行签名,提升效率和安全性。

5️⃣ ✅ 区块链和比特币

  • 区块链中的每个区块都包含前一区块的哈希值,构成链条。

  • 比特币使用 双重 SHA-256 进行挖矿、验证交易。


6️⃣ ✅ 版本控制系统(如 Git)

  • Git 使用 SHA-1 对文件内容、提交、分支等对象生成唯一标识符(hash ID)。

  • 每个提交都有一个像 e3b0c4... 的哈希值来标识。


🧪 五、一个直观例子(SHA-256)

bash 复制代码
echo -n "hello" | sha256sum

输出:

bash 复制代码
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

然后你改成 "Hello",就会得到完全不同的结果。


⚠️ 六、哈希函数不是加密!

加密 哈希
可逆 不可逆
有密钥 无密钥
用于信息隐藏 用于身份/完整性验证
AES, RSA 等 MD5, SHA-256 等

✅ 七、总结表

项目 内容
定义 将任意长度数据映射为固定长度输出的函数
特点 确定性、固定长度、抗碰撞、不可逆
用途 密码保护、数据完整性、哈希表、签名、区块链、Git
代表算法 SHA-256、SHA-3、MD5(不推荐)、SHA-1(不推荐)
相关推荐
鱼鱼不愚与5 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络10 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷1 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络1 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络1 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4001 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4001 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2123 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2124 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试