计算越长,出错越难忽略
1946年,理查德·汉明从洛斯阿拉莫斯来到美国新泽西州默里希尔的贝尔电话实验室,加入数学研究组。计算机需要把读入的数字反复送入运算,继电器、读入装置或传输线路上的一次错误,可能改变此后整串计算。电话交换机中一次接错主要影响某次通话,长时间数值计算却会沿着同一条计算链不断使用已有结果,因此不能只靠操作员最后查看答案。
当时机器已经会进行错误检查,但发现异常之后往往需要停机处理。汉明关心的是:能否在表示数据时附加少量有规律的数字,让机器自己找出错误的位置?1950年4月,他在《贝尔系统技术期刊》发表《检错码与纠错码》。本文以论文发表年为节点;论文描述的是此前形成的研究成果,不是说所有装置到这一年才开始使用校验。
一个校验位为什么还不够
最简单的办法是奇偶校验。发送端在数据后加一位,使整组数字中“1”的个数成为偶数;接收端重新计数。如果其中一位从0变为1,或从1变为0,奇偶性就会改变。这种规则不必保存另一份完整原文,因此增加的开销很小,也适合用电路执行。
不过,一次校验只能指出这组数据不合规定,不能说明哪一位错了;两位同时翻转还可能使奇偶性恢复正常。把每位重复三次并按多数表决,可以纠正一定范围的错误,却明显增加存储和传送负担。汉明的改进在于使不同校验彼此交叠,用多次检查所得的组合结果标记位置。
把检查结果变成位置
以七位码组容纳四位信息为例,另外三位承担校验。每个码位参加一组独特的检查,接收端算出的三个校验结果共有八种组合:一种表示没有发现单比特错误,其余七种分别对应七个位置。关键不在于校验位必须摆在纸面上的哪个地方,而在于七个位置不能拥有完全相同的检查组合。
采用一种常见编号方式,可把校验位放在第1、2、4位,把信息放在第3、5、6、7位。第一组检查1、3、5、7位,第二组检查2、3、6、7位,第三组检查4、5、6、7位。假如只有第5位翻转,第一、第三组检查失败,第二组通过;把结果按4、2、1的权重排列,就得到二进制101,即位置5。
这个例子是校验结构的具体演算:定位以后,把该位取反即可修正,错误即使发生在校验位本身,也能用同一程序处理。接收者不需要询问发送者原文是什么,但必须知道双方约定的分组方式,并且满足单比特错误的假设。
纠正一位与识别两位
汉明又用码字之间不同位置的数量讨论可靠性,后来这一度量被广泛称作汉明距离。有效码字之间留出足够间隔,受扰动的结果才能更接近唯一一个原码字。七位单错纠正码可以纠正任意一位错误,但若两位同时出错,盲目按单错规则修复就可能改坏第三位。
为区分这种情况,可以再加一个覆盖全码组的奇偶校验位,构成八位方案。在其设计范围内,译码器能够纠正一位错误,并对两位错误发出警告。这里的“纠正”和“检测”是两项不同能力,增加校验也不是对任意数量或任意模式的错误作无限保证。
从组合规则进入可靠机器
汉明与伯纳德·霍尔布鲁克共同署名的《检错与纠错系统》专利于1950年申请、1951年授权,进一步用继电器、寄存与校验电路说明编码、检查和错误反转如何衔接。论文给出可分析的结构,专利则展示装置实现所需的信号路径,两种记录反映了研究与工程化之间的联系。
此后,计算机存储器等系统采用汉明码及其扩展,使少量冗余成为可靠性的组成部分。其意义不是消除元件故障,而是承认故障可能发生,并在规定条件下减少重算、重传和人工维护。更复杂的纠错码继续处理成串错误、较大码组和更高效率;1950年论文留下的单错纠正结构,则是这条技术路线中清楚、可检验的一步。