Hamming 纠错码
是什么
Hamming 码是 1950 年 Richard Hamming 在 Bell 实验室发明的让数据传输 / 存储里 1 位翻转能自动检出 + 修复的编码。
日常类比:身份证号 18 位,最后 1 位是前 17 位算出的校验码——抄错 1 位立刻能发现,甚至能猜出哪位错了。
具体看 Hamming(7, 4):把 4 位数据 + 3 位校验拼成 7 位发出去;哪怕路上有 1 位被噪声翻转,接收方也能算出”是第几位错了”,把它翻回来。
为什么重要
不理解 Hamming 码,下面这些事都没法解释:
- 为什么服务器内存(ECC RAM)几乎都用 SEC-DED 编码——单错纠正、双错检测,Hamming 是它的直接祖先
- 为什么 CD / DVD / 二维码 / 卫星通信里”刮花一点也能读出来”——纠错码是这能力的核心
- 为什么 shannon-1948 1948 年证明”100% 可靠传输”在嘈杂信道上数学可行后,Hamming 1950 给了第一个可以真用的实例
- 为什么后来 Reed-Solomon、Turbo、LDPC、Polar 都要回头说”我们对 Hamming 距离做了什么改进”
核心要点
Hamming 码的全部秘密就 三件事:
-
海明距离:两段二进制有多少位不同。距离 = 1 表示差 1 位,距离 = 3 表示差 3 位。要纠正 1 位错误,所有”合法码字”两两距离至少要 3——这样 1 位翻转后,离原码字最近,离别人都更远。
-
校验位放 2 的幂次位置:编号 1, 2, 4, 8, … 处放校验位,其它位置放数据位。每个校验位”覆盖”二进制编号包含它那一位的所有位置。
-
错位定位 = 不匹配校验位的位置和:接收端每个校验位重算一遍;某些校验位对不上,把它们的位置编号加起来(二进制看),就是出错那一位的编号。
三件事合起来叫 Hamming(n, k) 编码,n 是总长、k 是数据长。
实践案例
案例 1:手算 Hamming(7, 4) 编码
要发的数据:1011(4 位)。按位置摆开:
位置: 1 2 3 4 5 6 7内容: p1 p2 1 p3 0 1 1校验位计算(每个 p 是它覆盖位置上数据位的 XOR):
- p1 覆盖位置 1, 3, 5, 7 → p1 = 1 ⊕ 0 ⊕ 1 = 0
- p2 覆盖位置 2, 3, 6, 7 → p2 = 1 ⊕ 1 ⊕ 1 = 1
- p3 覆盖位置 4, 5, 6, 7 → p3 = 0 ⊕ 1 ⊕ 1 = 0
发出去的码字:0 1 1 0 0 1 1(7 位)。
案例 2:翻转 1 位,看接收端怎么救回来
发出 0110011,第 5 位被噪声翻转,收到 0110111。接收端重算每个校验位看对不对:
- p1 覆盖位置 1, 3, 5, 7:0 ⊕ 1 ⊕ 1 ⊕ 1 = 1,错
- p2 覆盖位置 2, 3, 6, 7:1 ⊕ 1 ⊕ 1 ⊕ 1 = 0,对
- p3 覆盖位置 4, 5, 6, 7:0 ⊕ 1 ⊕ 1 ⊕ 1 = 1,错
对不上的是 p1 和 p3,它们的位置编号是 1 和 4 → 加起来 1 + 4 = 5 → 第 5 位有错。把第 5 位翻回去,原码字恢复。
实操要点:解码端的逻辑非常简单——所有校验位重算 → 拼成”症状向量” → 把这个向量当二进制读出即出错位置。整个解码可以在硬件上 1-2 个时钟周期完成,这也是 ECC 几乎不增加内存延迟的根本原因。
案例 3:服务器内存里的 Hamming(72, 64)
ECC RAM 每个 64 位 word 加 8 位校验,总共 72 位。任何 1 位翻转能纠正,2 位翻转能检测(来不及救但至少不让你以为是对的)。这就是 SEC-DED(Single Error Correct, Double Error Detect)——Hamming(8, 4) 的工业升级版。
错误来源:宇宙射线撞 DRAM、芯片封装里微量铅衰变出 α 粒子、电荷泄漏。Google 2009 年研究显示数据中心规模下每 GB 每年有几万次可纠正错误——没有 Hamming 这层保护,服务器跑不了几小时。
踩过的坑
-
只能纠 1 位错,不能纠 2 位:Hamming(7, 4) 码字两两最小距离是 3。2 位错误会让接收端”纠正”到另一个合法但错误的码字,反而掩盖问题。这就是为什么 ECC RAM 必须用 SEC-DED——加一位让 2 位错误至少能被发现。
-
突发错误效果差:磁带划痕、闪存连续单元失效、信道突然干扰这种”几位连着错”,Hamming 完全救不回来。要用 Reed-Solomon——它按”符号”(一组位)算距离,对突发错误天然友好。
-
不抗主动篡改:攻击者知道编码规则,可以算出合法校验位伪造一个码字。Hamming 是”防意外噪声”,不是”防恶意攻击”——后者要 MAC、签名这些密码学工具。
-
校验位本身也可能翻转:好消息是算法已经处理了——如果 p1 翻转,重算时它和数据算出的不一样,错位指向 p1 自己的位置(1, 2, 4 之一)。算法对数据位和校验位一视同仁。
适用 vs 不适用场景
适用:
- 服务器内存 ECC(SEC-DED 是必备)
- CPU 内部 cache、寄存器奇偶校验
- 早期 NAND flash(SLC、低密度 MLC)
- 教学:理解纠错码思想的入门款
不适用:
- 突发错误为主的信道(磁带、光盘、TLC / QLC NAND)→ 用 Reed-Solomon
- 接近 Shannon 容量的极限场景(5G 数据信道、深空通信)→ 用 LDPC、Polar、Turbo
- 防恶意篡改 → 用 MAC、数字签名
- 量子比特纠错 → 不能简单照搬,要同时处理位翻转 + 相位翻转两种错(Shor 1995 的 9 量子比特码)
历史小故事(可跳过)
- 1947 年:Hamming 在 Bell 实验室用早期电脑跑数据,机器一遇错就自动跳过当前任务转下一个。Hamming 周末上班,发现两天的活全跳过了,气得发问:“机器既然能检测错误,为什么不能修正?”
- 1948 年:Shannon 在同一栋楼发表《通信的数学理论》,证明纠错编码理论上可行——但没给可用的构造方法。
- 1950 年 4 月:Hamming 在 BSTJ 发表本文,给出第一个实用纠错码。为什么晚 Shannon 两年?——Bell 实验室法务把论文压了三年等专利申请落地(U.S. Patent 2,552,629,1951 年获批)。
- 1968 年:Hamming 拿 ACM 图灵奖。
- 1986 年:Hamming 在海军研究生院做著名讲座 “You and Your Research”——这篇讲座在 CS 界传播比 Hamming 码本身还广,讨论”怎么做出值得做的研究”。
- 1990 年代:DRAM 容量飙升让位错率绝对值上来,ECC RAM 从企业服务器普及到工作站。
- 2000 年代:闪存 SLC → MLC,单元干扰增大;Hamming 让位 BCH / LDPC,但起步时仍是 Hamming(72,64) 当 baseline。
- 2020 年代:DDR5 内置 on-die ECC(每个 chip 自带 SEC 编码),Hamming 思想延续到芯片级而不是只到模组级。
学到什么
- 冗余 = 纠错能力的来源:信息可以”花掉”几位换得”修正能力”。这是过去 70 年所有可靠系统的底层假设。
- 位置编号设计的妙处:把校验位放 2 的幂次位置,让出错位置直接 = 不匹配校验位的位置和——这是 Hamming 最优雅的部分,不是数学高深,是编号选得好。
- 理论 → 工程的滞后:Hamming 1950 → ECC RAM 大规模商用 1980 年代,间隔 30 年。理论先备好工具箱,工程等问题出现才把工具箱打开。这是技术史常见模式(Shannon 信息论 1948 → Turbo 码 1993,间隔 45 年)。
- 数学上的”完美”未必工程上最优:Hamming 码达到球填充上界等号,称为完美码——但 LDPC、Polar 不是完美码却更接近 Shannon 极限。完美是一种美学,不是工程目标。
- 错位定位 = 校验和的代数结构:Hamming 的优雅在于”错位编号”刚好等于”不匹配校验位编号的二进制和”,这是把问题当线性代数解的早期范本——后来 BCH、Reed-Solomon 都在同一个框架内
- 小问题催生大领域:Hamming 周末两天活被电脑全跳过的”日常烦恼”,催生了一个跨 70 年的纠错码学科——研究问题往往就藏在工程师的一句抱怨里
- 检测 vs 纠正的区别要分清:检测只需要发现”不对”,纠正还要”知道哪里不对”。前者用奇偶就够,后者必须有几何结构(最小距离 ≥ 2t+1)
- 冗余位是定价:(7,4) 码用 3 bit 冗余换 1 位纠错——空间开销 75%,但对当年穿孔卡片机来说仍是”周末加班 vs 周一交付” 的差距,工程权衡里”贵 75%” 经常不是问题
延伸阅读
- 视频教程:3Blue1Brown — Hamming codes part 1: how to fix bugs in binary(动画讲解,零基础友好)
- 续作:3B1B — part 2: the elegant algebra(XOR 视角下的同一算法)
- 自己写实现:用 Python 30 行写完 Hamming(7, 4) encoder / decoder
- 进阶教材:MacKay《Information Theory, Inference, and Learning Algorithms》第 1 章用 Hamming 码引出整本书
- 论文 14 页 PDF:Hamming 1950 BSTJ 原文
- Hamming 演讲:“You and Your Research”——研究方法论比纠错码影响更广
- shannon-1948 —— 信息论奠基;Hamming 是它的第一个实用构造
- reed-solomon-1960 —— 把 Hamming 思想推广到符号级,能纠突发错误
关联
- shannon-1948 —— Shannon 给出纠错码的存在性,Hamming 给出可构造
- reed-solomon-1960 —— Reed-Solomon 用 Hamming 距离思想,按符号纠错
- polar-codes-2009 —— 5G 控制信道标准,纠错码进化到逼近 Shannon 限
- turing-1936 —— 同样是早期 CS 经典,可计算性与可靠性是两条主线
反向链接
- aes —— AES Rijndael 对称分组密码
- great-swe —— Great SWE — 资深工程师”伟大”的标准是 humble + always learning
- polar-codes-2009 —— Polar 极化码 — 把好坏不一的信道整成”完美/全错”两组
- reed-solomon-1960 —— Reed-Solomon 编码
- saltzer-1984-e2e —— End-to-End Arguments — 把功能尽量推到端上做
- shannon-1948 —— Shannon 1948 — 信息论的诞生
- turing-1936 —— Turing 1936 可计算性