哈希函数的应用
密码学哈希函数(如 SHA-256 和 SHA3-256)可用于许多场景。下面介绍最常见的应用。
文档完整性
验证文件、文档或消息的完整性。例如,SHA256 校验和可以确认某个文件是否为原始文件,即计算校验和后未被修改。

上面的截图展示了 OpenSSL 官方网站如何使用 SHA256 校验和来确保 OpenSSL 文件的完整性。
存储密码
存储和验证密码。开发者通常不会在数据库中保存明文密码,而是保存密码哈希,或由密码派生出的更复杂值,例如通过 Scrypt 派生的值。

上面的示例来自现代 Linux 系统中的 /etc/shadow 文件。图中的密码以经过加盐和多轮计算的 SHA-512 哈希形式存储。
生成唯一 ID
为某个文档或消息生成一个(近似)唯一 ID。密码学哈希函数根据文档内容,几乎可以唯一标识文档。理论上,任何密码学哈希函数都可能发生碰撞,但发生的概率非常低,因此大多数系统(如 Git)都假设其使用的哈希函数不会发生碰撞。
通常先对文档进行哈希,之后使用文档 ID(哈希值)证明文档存在,或从存储系统中检索文档。基于哈希的唯一 ID 示例包括 Git 和 GitHub 中依据提交内容生成的提交哈希(如 3c3be25bc1757ca99aba55d4157596a8ea217698),以及 Bitcoin 地址(如 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2)。

在上面的示例中,SHA-1 唯一 ID 标识 GitHub 中的某次提交。
伪随机数生成
伪随机数生成和密钥派生。哈希值可以充当随机数。生成随机序列的一种简单方法如下:从一个随机种子开始,该种子是从键盘按键或鼠标移动等随机事件中收集的熵;追加 "1" 并计算哈希,得到第一个随机数;然后追加 "2" 并计算哈希,得到第二个随机数;以此类推。稍后会提供一个实现该思路的 Python 示例。
工作量证明算法
工作量证明(PoW)算法。大多数工作量证明算法要求计算出一个大于特定值(称为挖矿难度)的哈希值。由于哈希数值不可预测,矿工会计算数十亿个不同的哈希值,并从中选择最大的一个,以找到目标哈希。例如,工作量证明问题可以定义为:找到一个数 p,使得 hash(x + p) 的开头包含 10 个零位。
密码学哈希是现代编程的一部分
密码学哈希函数应用如此广泛,以至于现代编程语言和平台的标准库通常会将它们实现为内置函数。