公众号旧文

为什么 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 不是在比较文件,而是在比较文件的指纹。

只要指纹一样,我们就认为它是同一个文件。

扩展阅读


Linux 免密登录简明教程

服务器断联后恢复,怎么知道是啥时候断的?

AI 最大的问题不是替你做,而是让你不想做

Tailscale 简明安装/登录/使用教程

胖子百科公众号,即日起开始接投稿,请直接发送稿件到公众号菜单联系方式中的电子邮箱,文章发布后7日内的收入将全部打给投稿人。