背景介绍
海明码由Richard Hamming于1950年提出、目前还被广泛采用的一种很有效的校验方法,是只要增加少数几个校验位,就能检测出二位同时出错、亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段,后者被称为自动纠错。它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。
这种能找出并纠正数据块在传输过程中出现的错误的编码方法,对于计算机技术和通信技术来说真是太重要了。发明这种编码技术的理查德·哈明因此而获得了第三届即1968年度的图灵奖。
海明编码
1.校验位位数
设校验码有k位有效信息和r个校验位,一个校验位Pi要负责监督多个有效位bi,因此r个校验位就有r个分组,每个可以构成一个指错字,也就是说每个“小组长”需要汇报自己组员的情况,一个组员可以加入多个小组,各个组长的信息综合起来便知道这个成员情况了。
r个校验位可以指出2r种状态,其中一种表示无错,剩下的状态可以指出2r-1位中某位的错误。
因此有式子(指出并纠正一处错误):
k + r ≤ 2 r − 1 k + r \leq 2^r - 1 k+r≤2r−1
把r移到右边去:
k ≤ 2 r − r − 1 k \leq 2^r -r- 1 k≤2r−r−1
2.分组原则
为了方便最后算出哪一位出错,我们把位号为2n(n = 0, 1, 2, …)的位置全部留给校验位,其他的安放有效位,两者相互穿插组成海明码(Hamming Code)。
e.g.
k = 7, r = 4
位号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
内容 | P1 | P2 | b1 | P3 | b2 | b3 | b4 | P4 | b5 | b6 | b7 |
之后再看分组规则:
第i位由位号和=i的校验位组成
e.g.
7 = 1 + 2 + 4
对于Pi而言有:Pi = 2i-1(i≥1)
故:b4 = P1 + P2 + P3
而由于b4组分之一是P1,故P1的分组里包含b4。
再举个例子:
设有效信息为b1b2b3b4 = 1011,其中k=4,k ≤ 23 - 3 - 1,因此取最小的r为3。
3 = 1 + 2, 5 = 1 + 4, 6 = 2 + 4, 7 = 1 + 2 + 4
参考上表可得:
P 1 = b 1 ⨁ b 2 ⨁ b 4 = 1 + 0 + 1 = 0 P_1 = b_1\bigoplus b_2\bigoplus b_4=1+0+1=0 P1=b1⨁b