1.1 校验码
码距与校验码:通俗理解数据安全的基石
一、码距(海明距离)
1. 定义
码距,又称海明距离,是衡量两个等长编码之间差异程度的指标。简单来说,就是两个编码在相同位置上,对应位不同的个数。它代表了将一个编码转换为另一个编码,最少需要改变多少个位。
2. 举例说明
- 示例一:编码 A =
00,编码 B =11。对比每一位,第1位(0和1)不同,第2位(0和1)也不同,共有 2位 不同,因此码距为 2。 - 示例二:编码 A =
1010,编码 B =1100。从左到右对比,第1位相同,第2位(0和1)不同,第3位(1和0)不同,第4位相同。共有 2位 不同,因此码距为 2。
3. 最小码距
在一个编码集合中,任意两个合法编码之间的最小海明距离,被称为最小码距(d_min)。它是衡量整个编码系统抗干扰能力的关键指标。
举例:假设一个编码集合包含三个合法编码:000、011、101。
| 编码对 | 码距 |
|---|---|
| 000 与 011 | 2 |
| 000 与 101 | 2 |
| 011 与 101 | 3 |
在这个集合中,最小的码距是 2,因此该编码系统的最小码距 d_min = 2。
4. 码距的作用
码距直接决定了编码系统的检错和纠错能力:
- 检错能力:若最小码距为 d,则最多可检测 d-1 个错误。
- 纠错能力:若最小码距为 d,则最多可纠正 ⌊(d-1)/2⌋ 个错误(⌊ ⌋ 表示向下取整)。
- 核心规律:码距越大,编码的纠错和检错能力就越强。
简单例子:
- 若 d_min = 2,最多可检测 2-1=1 个错误,最多可纠正 ⌊(2-1)/2⌋ = 0 个错误。这说明它只能发现1位错误,但无法纠正。
- 若 d_min = 3,最多可检测 3-1=2 个错误,最多可纠正 ⌊(3-1)/2⌋ = 1 个错误。这说明它不仅能发现2位错误,还能准确纠正1位错误。
二、校验码概述
1. 校验码的定义
校验码是在原始数据的基础上,按照特定规则添加的额外数据位(冗余位)。接收方利用这些冗余位,可以验证数据在传输或存储过程中是否发生了改变。
2. 校验码的作用
在数字世界中,信号干扰、硬件老化等因素都可能导致数据出错(如0变成1)。校验码的核心作用就是保障数据的完整性和可靠性,确保"发什么就收什么"。
3. 校验码的分类
- 检错码:只能发现数据是否出错,但无法知道具体是哪一位出错,因此不能自动纠错。
- 纠错码:不仅能发现错误,还能根据冗余信息自动定位并纠正错误位。
三、奇偶校验码(Parity Check)
1. 原理
奇偶校验是最简单的校验方法。它在原始数据后增加 1位校验位,使得整个编码中"1"的个数满足特定条件:
- 奇校验:整个编码中"1"的总数为奇数。
- 偶校验:整个编码中"1"的总数为偶数。
加入这1位校验位后,合法编码之间的最小码距变为 2。
2. 检错能力
它可以检测出奇数个位出错(如1位、3位),但无法检测偶数个位出错(如2位同时翻转,1的个数奇偶性不变)。此外,它不具备纠错能力。
3. 简单举例
以原始数据 1101 为例(其中包含3个"1"):
- 奇校验编码:数据已有3个"1"(奇数),为保持奇数,校验位填
0。最终编码为11010。 - 偶校验编码:数据已有3个"1"(奇数),为凑成偶数,校验位填
1。最终编码为11011。
如何检测错误:假设采用偶校验,发送了 11011。如果接收方收到 10011,重新计算"1"的个数,发现有3个(奇数),与偶校验规则不符,判定出错。
4. 优缺点
- 优点:实现极其简单,硬件开销小。
- 缺点:检错能力弱,无法纠错,无法发现偶数个错误。
四、循环冗余校验码(CRC)
1. 原理
CRC 是一种基于多项式除法的检错技术。发送方和接收方约定一个生成多项式(如 1011)。发送方用原始数据除以该多项式(模2除法,即异或运算,不借位),将得到的余数作为校验位(FCS)附加在数据后面发送。接收方用同样的多项式去除接收到的数据,若余数为0,则认为数据正确。
2. 检错能力
CRC 检错能力极强,能检测出绝大多数突发错误,但它只能检错,不能纠错。
3. 简单举例
- 数据:
1100 - 生成多项式:
1011(4位,余数应为3位) - 编码过程:
- 数据
1100后面补3个0变为1100000 - 用
1100000除以1011(模2除法),得到余数100 - 将余数替换补的0,最终发送的数据为
1100100
- 数据
- 校验过程:接收方收到
1100100,除以1011,若余数为000,则校验通过。
4. 应用场景
广泛应用于网络通信(如以太网、Wi-Fi)、磁盘存储、ZIP/RAR 压缩文件等。
五、海明校验码(Hamming Code)
1. 原理
海明码通过在数据位中插入多个校验位,且每个校验位负责校验不同的数据位组合,从而构建出更大的码距。
2. 检错与纠错能力
经典的海明码最小码距为 3,因此它可以检测2位错误,并能纠正1位错误。
3. 简单举例(简化版)
以4位数据 1011 为例,需插入3个校验位(P1, P2, P3),组成7位海明码。
- 编码:通过特定的奇偶校验规则,计算出 P1=0, P2=1, P3=0,最终编码为
0110101(位置排列为 P1 P2 D1 P3 D2 D3 D4)。 - 纠错:若传输中第3位出错,变为
0100101。接收方重新计算各校验组的奇偶性,发现 P1、P2 组报错,P3 组正常。将报错的校验位位置号相加(1+2=3),精准定位到第3位出错,将其翻转即可纠正。
4. 应用场景
主要用于对可靠性要求极高的场景,如服务器 ECC 内存、卫星通信、深空探测等。
六、校验和(Checksum)
1. 原理
将数据按固定长度(如16位)分成若干段,将所有段进行二进制加法运算(忽略最高位的进位溢出),最后将结果取反码,即为校验和。接收方用同样的方法计算,若结果全为1(或全为0,取决于实现),则校验通过。
2. 简单举例
假设数据分为两段:1010 和 0101。
- 求和:1010 + 0101 =
1111 - 取反码:
1111的反码为0000 - 发送的数据附带校验和
0000。接收方将1010、0101、0000相加,结果为1111(全1),校验通过。
3. 应用场景
主要用于 TCP/IP 协议族中,如 IP 首部校验和、TCP/UDP 校验和。
七、Luhn 算法(模10校验)
1. 原理
Luhn 算法是一种针对十进制数字的校验算法,常用于人工输入场景。规则如下:从右往左数,将偶数位的数字乘以2(若结果大于9则减去9),然后将所有位的数字求和,最后对10取模。若余数为0,则校验通过。
2. 简单举例
以银行卡号 1234 为例(从右往左):
| 位置(从右) | 数字 | 处理 | 结果 |
|---|---|---|---|
| 第1位(奇数位) | 4 | 不变 | 4 |
| 第2位(偶数位) | 3 | 3×2=6 | 6 |
| 第3位(奇数位) | 2 | 不变 | 2 |
| 第4位(偶数位) | 1 | 1×2=2 | 2 |
- 求和:4 + 6 + 2 + 2 = 14
- 取模:14 % 10 = 4 ≠ 0,因此该号码无效。
若末位是0,和为10,10%10=0,则校验通过。
3. 应用场景
银行卡号、信用卡号、IMEI 码、社交账号等人工录入场景的防误输入验证。
八、各校验码对比表
| 校验码名称 | 校验位长度 | 检错能力 | 纠错能力 | 典型应用场景 |
|---|---|---|---|---|
| 奇偶校验码 | 1 位 | 可检测奇数个错误 | 无 | 早期串行通信、简单内存 |
| 循环冗余校验(CRC) | 16位/32位等 | 极强(可检突发错误) | 无 | 网络通信、磁盘存储、压缩包 |
| 海明校验码 | 多位(随数据增长) | 可检测2位错误 | 可纠正1位错误 | ECC内存、卫星通信 |
| 校验和(Checksum) | 16 位 | 较弱 | 无 | TCP/IP协议首部及数据校验 |
| Luhn 算法 | 1位(十进制) | 可检测单数字错误及相邻交换错误 | 无 | 银行卡号、信用卡号验证 |

浙公网安备 33010602011771号