第 1 课
什么是 Hash
理解单向摘要以及开发中的常见 Hash 场景。
Hash 函数 可以把任意长度的输入数据映射成固定长度的 摘要(digest),通常以十六进制字符串展示。在相同算法下,相同输入总会得到相同摘要;输入哪怕只改一个字符,摘要也往往会完全不同。
Hash 是单向的
你可以从数据计算出 Hash,但不能可靠地从 Hash 反推出原始输入。因此 Hash 适合作为指纹,而不是恢复秘密的手段。
Hash 是确定性的
如果用 SHA-256 对字节 Hello 计算两次,结果会一致。这让 Hash 非常适合做对比:
- 下载的文件是否与公布的 checksum 一致?
- 配置文件是否相对昨天发生了变化?
- 两个 API 载荷是否字节级相同?
开发中常见 Hash 场景
例如:
- 包管理器 lockfile 的完整性字段
- Git commit ID(基于 SHA-1,并有 Git 特有格式)
- HTTP
ETag与缓存键 - 与正确密钥拉伸结合后的密码存储(绝不是裸 MD5)
- 区块链与证书指纹(通常使用更强算法)
Hash 检测变化,不证明意图
Hash 只能告诉你:在选定算法下,两段字节是否一致。它不能告诉你数据是谁生成的、是否安全可运行,也不能单独证明第三方是否篡改——除非你已信任参考 Hash 的来源。