公众号旧文
为什么 hash 一样,文件就是完全一样的?
在网上下载软件时,你可能看到过这样的提示:
请校验文件的 hash 哈希值
然后给你一串很长的字符,让你自己算一遍,对比是否一致。
比如我之前写的服务器断联后恢复,怎么知道是啥时候断的?
里面 RIPE 给的安装流程中就有:

我大概知道这是为了验证文件的一致性,
但是为什么只要 hash 一样,就能说明文件完全一样?
本篇文章,就来把哈希值校验的原理讲一下。
一、hash,本质是文件指纹
可以把 hash 理解成给文件做一个指纹。
无论你的文件是:
- 1KB
- 100MB
- 10GB
最终都会被压缩成一段固定长度的字符串,比如:
34b7afff1d31e12746e04a6760f3711a52c108f5c951e2dffa9fe699fc7777ca
这段字符串,就是这个文件的唯一标识。
二、每一个字节都参与了计算
很多人会误以为,hash 是对整个文件做摘要。
但实际上文件里的每一个字节,都会参与计算。
也就是说:
- 改一个字符
- 多一个空格
- 少一个换行
都会影响最终的 hash。
举个最简单的例子:
hello → hash A
hellO → hash B(完全不同)
哪怕只是一个字母的变化,结果也会天差地别。
这就是所谓的雪崩效应:输入只变一点点,输出都会完全不同。
三、那为什么可以反推文件一致?
现在来看最关键的问题:
如果两个文件的 hash 一样,说明什么?
说明它们的每一个字节都一样。
原因很简单:
- hash 是所有字节共同计算出来的结果
- 只要有一个字节不同,结果就会变
所以反过来,如果结果没变,就说明没有任何字节变过。
也就是文件在“字节级”完全一致。
四、这就是为什么校验 hash 很重要
几乎所有正规软件发布,都会提供 hash。
比如你下载一个 .deb 包:
sha256sum file.deb
如果你算出来的结果和官网一致,那就说明你下载的文件,和官方发布的一模一样。
没有下载损坏,不存在中途篡改和网络错误。
五、一个很多人不知道的例外
这里有个容易被忽略的细节:
理论上,hash 是可能碰撞的。
也就是说:
- 两个不同文件
- 可能算出相同 hash
但这个概率低到几乎可以忽略,以 SHA256 为例:
- 碰撞难度 ≈ 2¹²⁸ 级别
碰撞概率比连续中彩票几百万次还低。
所以在现实工程中,我们默认 hash 一样 ≈ 文件完全一样。
六、真正需要注意的,不是 hash 碰撞
更需要警惕的是下面这些:
1️⃣ 使用了弱算法(MD5 / SHA1)
这些算法已经被证明可以人为制造相同 hash。
所以现在主流都是:
- SHA256
- 甚至更强的 SHA3
2️⃣ 你信错了官方 hash
如果官网本身被劫持,给你的 hash 就是假的,那你校验再认真也没用。
所以更严谨的做法是:
- 使用 HTTPS
- 多渠道验证
- 或者用 GPG 签名
七、一句话总结
你可以这样理解:
hash 不是在比较文件,而是在比较文件的指纹。
只要指纹一样,我们就认为它是同一个文件。
扩展阅读
胖子百科公众号,即日起开始接投稿,请直接发送稿件到公众号菜单联系方式中的电子邮箱,文章发布后7日内的收入将全部打给投稿人。