Skip to content

海明码

  • 海明(Hamming)码是通过冗余数据位来检测和纠正差错的编码方式。

  • 海明距离(码距):一个码字要变成另一个码字时必须改变的最小位数,即两个码字之间不同的比特数

例:

1011 01 00
1011 01 11

两个码字后两位不同(00 vs 11),海明距离(码距)为 2

例题:

海明码原理与海明不等式

海明码原理

在数据中间加入几个校验码码距均匀拉大,当某一位出错,会引起几个校验位的值发生变化。


海明不等式

校验码个数为 k,可以表示 2ᵏ 个信息:

  • 1 个信息用来表示没有错误
  • 其余 2ᵏ - 1 个表示数据中存在错误

如果满足:

2ᵏ - 1 ≥ m + k

(m 为信息位,m+k 为编码后的数总长度)

则在理论上 k 个校验码就可以判断是哪一位出现了问题。

编码规则

  • (i=0, 1, 2, 3...)位是校验位,其余位存放数据。
  • 假设传送信息 1001011,把数据放在 3、5、6、7、9、10、11 位置,1、2、4、8 留作校验位。

数据位初始分配

位置1234567891011
数据1001011

校验位与数据位的关系

每个数据位的位号可以分解为校验位号之和:

数据位分解参与校验位
32 + 11, 2
54 + 11, 4
64 + 22, 4
74 + 2 + 11, 2, 4
98 + 11, 8
108 + 22, 8
118 + 2 + 11, 2, 8

各数据位对应校验位(二进制表示)

数据位校验位
8421
3 0011
5 0101
6 0110
7 0111
9 1001
101010
111011

3、5、7、9、11 号位参加第 1 位校验。按偶校验计算,1 号位应为 1

计算校验位后的完整码字

类似地:

  • 3、6、7、10、11 号位参加 2 位校验
  • 5、6、7 号位参加 4 位校验
  • 9、10、11 号位参加 8 位校验

全部按偶校验计算,最终得到:

位置1234567891011
码字10110010011

红色为校验位,绿色为数据位。

错误检测示例

如果 6 号位在传输中出错(0 → 1),码字变为:

位置1234567891011
接收10110110011

接收端按同样规则计算奇偶性:

  • 1 号位奇偶性正确 ✅(ACK1 = 3,5,7,9,11)
  • 8 号位奇偶性正确 ✅(ACK8 = 9,10,11)
  • 2 号位奇偶性不对 ❌(ACK2 = 3,6,7,10,11)
  • 4 号位奇偶性不对 ❌(ACK4 = 5,6,7)

奇偶性不对的校验位:2 + 4 = 6,立即可确认错在 6 号位

例题

第一题

  • 第二题
  • 第三题
  • 第四题
  • 第五题