33.26 校验和与哈希

Emacs 内置支持计算 加密哈希(cryptographic hashes)。 加密哈希,又称 校验和(checksum),是一段数据(例如一段文本)的数字指纹, 可用于校验你所持有的数据副本是否未经篡改。

Emacs 支持多种常用加密哈希算法:MD5、SHA-1、SHA-2、SHA-224、SHA-256、SHA-384 以及 SHA-512。 MD5 是其中最古老的算法,常用于 消息摘要(message digests),以校验网络传输中消息的完整性。 MD5 与 SHA-1 不具备抗碰撞性(即可以刻意构造出不同数据却拥有相同 MD5 或 SHA-1 哈希值), 因此不应将其用于任何与安全相关的场景。 对于安全相关应用,应使用其他哈希类型,例如 SHA-2(如 sha256sha512)。

Function: secure-hash-algorithms

该函数返回一个符号列表,代表 secure-hash 支持使用的算法。

Function: secure-hash algorithm object &optional start end binary

该函数返回 object 的哈希值。参数 algorithm 为一个符号,指定要计算的哈希算法: 可选 md5sha1sha224sha256sha384sha512。 参数 object 应为缓冲区或字符串。

可选参数 startend 为字符位置,指定对 object 的哪一部分计算消息摘要。 若为 nil 或省略,则对整个 object 计算哈希。

若参数 binary 省略或为 nil,函数返回哈希的 文本形式(text form),为普通 Lisp 字符串。 若 binarynil,则返回 二进制形式(binary form) 的哈希,为存储在单字节字符串中的字节序列。 返回字符串的长度取决于 algorithm

  • 对于 md5:32 个字符(若 binarynil 则为 16 字节)。
  • 对于 sha1:40 个字符(若 binarynil 则为 20 字节)。
  • 对于 sha224:56 个字符(若 binarynil 则为 28 字节)。
  • 对于 sha256:64 个字符(若 binarynil 则为 32 字节)。
  • 对于 sha384:96 个字符(若 binarynil 则为 48 字节)。
  • 对于 sha512:128 个字符(若 binarynil 则为 64 字节)。

该函数不会直接从 object 文本的内部表示计算哈希(see 文本表示方式)。 相反,它会使用编码系统对文本进行编码(see 编码系统),并从编码后的文本计算哈希。 若 object 为缓冲区,则使用将该缓冲区文本写入文件时默认选用的编码系统。 若 object 为字符串,则使用用户偏好的编码系统(see Recognize Coding in GNU Emacs Manual)。

Function: md5 object &optional start end coding-system noerror

该函数返回 MD5 哈希。它已半废弃,因为在大多数用途下,等价于以 md5 作为 algorithm 参数调用 secure-hash。参数 objectstartend 的含义与 secure-hash 中一致。 函数返回一个 32 字符的字符串。

coding-systemnil,则指定用于编码文本的编码系统; 若省略或为 nil,则使用默认编码系统,与 secure-hash 相同。

通常情况下,若文本无法使用指定或选定的编码系统编码,md5 会报错。 但如果 noerrornil,则会静默改用 raw-text 编码。

Function: buffer-hash &optional buffer-or-name

返回 buffer-or-name 的哈希值。若为 nil,则默认使用当前缓冲区。 与 secure-hash 不同,该函数基于缓冲区的内部表示计算哈希,不考虑任何编码系统。 因此它仅适用于比较同一 Emacs 运行实例中的两个缓冲区,且不保证在不同 Emacs 版本间返回相同哈希。 在较大缓冲区上,它通常比 secure-hash 效率更高,且不会额外分配内存。

Function: sha1 object &optional start end binary

该函数等价于如下方式调用 secure-hash

(secure-hash 'sha1 object start end binary)

binarynil,返回 40 字符的字符串;否则返回 20 字节的单字节字符串。