熵 (信息量)

信息论中衡量不确定性的指标。文本的熵越高,越难预测、越难压缩;熵越低,冗余度越高、越容易压缩。

熵 (entropy) 是克劳德·香农于 1948 年提出的信息论核心概念。文本中的熵量化了"下一个字符有多难预测",单位为比特/字符。熵高的文本信息密度大,熵低的文本冗余度高。

英文文本的熵,香农本人通过让人预测下一个字符的实验,估计为 0.6 至 1.3 比特/字符。如果 26 个字母等概率出现,则熵为 log₂(26) ≈ 4.7 比特/字符,但实际上"e"出现频率最高而"z"几乎不出现,加上"th""ing""tion"等高频模式的存在,实际熵大幅降低。

中文文本每个字符的熵高于英文。仅常用汉字就有数千种,预测下一个字符比英文更困难。不过,中文单字承载的信息量比英文多 (一个汉字往往就能表达相当于数个英文字母的信息),因此表达相同内容所需的字符数,中文比英文更少。

熵与文本压缩直接相关。根据香农的信源编码定理,文本的压缩极限由熵决定。熵为 1.3 比特/字符的文本,理论上每个字符最多只能压缩到 1.3 比特。与 ASCII 的 1 字符 = 8 比特相比,就削减率而言约 84% 是理论上限 ("压缩率"一词,既可指压缩后相对原大小的剩余比例,也可指削减掉的比例,因此读取数字前需先确认它指的是哪一种)。不过,能逼近这一上限的,是那种能依据上下文强预测下一个字符的压缩器,英文文本报告的约 1.5 比特/字符出自 PPM 类方法。gzip、Brotli 这类通用压缩器,其设计靠字典和编码效率取胜,因此停留在离理论极限仍有相当余量的水平。

密码强度评估也用到熵的概念。8 位纯小写字母密码的熵为 log₂(26⁸) ≈ 37.6 比特,而包含大小写字母、数字和符号 (95 种字符) 的 8 位密码熵为 log₂(95⁸) ≈ 52.6 比特。增加密码长度或增加字符种类都能提高熵,但真正见效的是长度。字符种类只是改变底数 (26 还是 95),而长度是作为指数施加于这个底数之上,因此在上例中,把字符种类从 26 扩大到 95 所换来的 15 比特,只要保持纯小写字母再多加 4 个字符就能反超。

不过,这一计算只有在每个字符都真正随机选取时才成立。像人想出来的"Password1!"这样的字符串,即便加了符号和数字,其强度也达不到计算所得的熵值,因为攻击方会优先尝试单词、词形变化以及常见替换 (把 a 换成 @ 之类)。基于这一情况,NIST SP 800-63B 的现行版本并未把熵的比特数指定为要求。其要求的形式是:作为单一要素使用的密码需 15 个字符以上、作为多要素之一则需 8 个字符以上,最多接受 64 个字符,不强制混用字符种类的构成规则,并与已泄露密码的黑名单进行比对。熵是估算强度的工具,本身并不是合格与否的标准。

从字符计数的角度看,熵是"相同字符数能传递多少信息"的理论指标。X (原 Twitter) 的发文上限是 280,但中文字符每个按 2 计算,所以中文实际只有约 140 个字符。同样是这 140 个字符,套话式的问候 (低熵) 与专业的技术解析 (高熵) 所传递的信息量截然不同。在有字数限制的媒介中,要最大化信息量,去除冗余表达、提高熵是行之有效的做法。

分享这篇文章