计组_HammingCode海明码校验
海明(汉明)(Haiming code)校验码
-
海明码是广泛采用的一种有效的校验码,它实际上是一种
多重奇偶
校验码。 -
其实现原理是
- 在有效信息位(数据码)中加入几个校验位形成海明码
- 并把海明码的 每个二进制位分配到几个奇偶校验组中
-
当某一位出错后,就会
引起有关的几个校验位的值发生变化
,-
这不但可以发现错位存在
-
还能指出错位的位置,为自动纠错提供依据
-
-
根据纠错理论得
-
L 一 1 = D + C ( L = D + C + 1 ) C ≤ D L一1=D+C \\(L=D+C+1) \\C\leq D L一1=D+C(L=D+C+1)C≤D
-
即编码
最小码距L
越大,- 其检测
错误的位数D
越大 纠正错误的位数C
也越大,- 纠错能力恒小于等于检错能力
- 其检测
-
海明码就是根据这一理论提出的具有纠错能力的一种编码。
-
根据海明码的位数
-
根据公式确定符合要求的海明码位数
-
设 n n n为有效信息的位数, k k k为校验位的位数,满足
-
检错1位:
-
n + k ≤ 2 k − 1 n+k ≤ 2^k -1 n+k≤2k−1
-
n = 0 , 1 , 2 , ⋯ n=0,1,2,\cdots n=0,1,2,⋯
-
k = 0 , 1 , 2 , ⋯ k=0,1,2,\cdots k=0,1,2,⋯
- 通常, k ⩾ 2 k\geqslant2 k⩾2,不过在这个阶段我们暂且把0,1也考虑进去
-
-
n ⩽ 2 k − k − 1 n\leqslant{2^k}-k-1 n⩽2k−k−1
-
k y ( k ) = 2 k − k − 1 y(k)=2^k-k-1 y(k)=2k−k−1 k位校验码可以应对的有效位n的上限(一位检错) 范围(推荐) 0 1-0-1=0 0 0 1 2-1-1=0 0 0 2 4-2-1=1 1 [0,1] 3 8-3-1=4 4 [2,4] 4 16-4-1=11 11 [5,11] 5 32-5-1=26 26 [12,26] 6 64-6-1=57 57 [27,57] 7 128-7-1=120 120 [58,120] … … … … -
一般来讲,k=4已经足够应付一般的问题(可以校验11)
-
-
为了使用上的方便,将n作为索引关键字查表
-
列出表格的前几项也容易
-
n的范围(数据码的位数) 对应需要的校验位k(下限) [0,1] 2 [2,4] 3 [5,11] 4 [12,26] 5 [27,57] 6 [58,120] 7 … …
-
-
-
要检测两位错,则需再增加1位校验位,即 k + 1 k+1 k+1位
-
-
确定k的原则
- k值在满足要求的情况下尽量的小,可以取m,就不要取m+1或者更大的数
例
-
🎈设
- 数据码D的各个位上的二进制值 D = D n ⋯ D 1 ; D=D_n\cdots{D_1}; D=Dn⋯D1;
- 海明码位数为 s = n + k s=n+k s=n+k🎈
- D的海明码表示为 H = H ( D ) = H s , ⋯ , H n + 1 , H n , ⋯ , H 1 H=H(D)=H_{s},\cdots{,H_{n+1},H_n},\cdots{,H_1} H=H(D)=Hs,⋯,Hn+1,Hn,⋯,H1
-
例 如 取 D = 1011 例如取D=1011 例如取D=1011, n = 4 n=4 n=4,作为例子
-
确定k(从给定的条件已经知道n=4)
- 方法1:自行建立表,查表得知,k=3比较合适
- 方法2:试探法(凭借经验,不是从k=1开始试探,而直接从某个大于0的值开始试探)
- 可以结合二分查找,确定k,
- 海明码位数为 n + k = 7 ≤ 2 3 − 1 n+k=7≤2^3-1 n+k=7≤23−1成立,则 k = 3 k=3 k=3恰好满足要求
-
设信息位为 D 4 ; D 3 , D 2 , D 1 D_4;D_3,D_2,D_1 D4;D3,D2,D1;(D=1010),共4位,
-
校验位为 P 3 , P 2 , P 1 P_3,P_2,P_1 P3,P2,P1,共3位,
-
则对应的海明码(海明码位串)为H(D)= H 7 H 6 H 5 H 4 H 3 H 2 H 1 H_7H_6H_5H_4H_3H_2H_1 H7H6H5H4H3H2H1
- 容易看出表达式, H i H_i Hi的含义:
-
其 中 i 的 可 能 取 值 : i = 1 , 2 , ⋯ n + k 其中i的可能取值:i=1,2,\cdots{n+k} 其中i的可能取值:i=1,2,⋯n+k
-
这里的 H i H_i Hi表示海明位的各个二进制位数码的取值(Hamming)
-
而下标 i i i表示海明位序号(位置)
-
例如某个海明码 H = 1010010 H=1010010 H=1010010
-
海明位序号(索引) 7 6 5 4 3 2 1 海明位 H 7 H_7 H7 H 6 H_6 H6 H 5 H_5 H5 H 4 H_4 H4 H 3 H_3 H3 H 2 H_2 H2 H 1 H_1 H1 取值 1 0 1 0 0 1 0
-
确定校验位的分布
-
规定校验位 P i P_i Pi在
海明位号
为 2 i − 1 2^{i-1} 2i−1的位置上 -
其余的海明位是信息位
-
可以这样类比
- 海明号作为座位(椅子)的编号
- 海明码中的校验位和信息位分别类比位保安和游客
-
我们需要计算出k个保安应该就位到那些海明号(作为 H i H_i Hi的值)
-
譬如, i i i号校验码( P i P_i Pi)需要放在 2 i − 1 2^{i-1} 2i−1的位置上
- 两套编号系统的一个映射函数(对应关系) s i t e ( P i ) site(P_i) site(Pi)= 2 i − 1 2^{i-1} 2i−1
- 为了简化书写,用函数 j = j ( i ) = 2 i − 1 j=j(i)=2^{i-1} j=j(i)=2i−1表示映射关系
-
下表中 i = 1 , ⋯ , k i=1,\cdots,k i=1,⋯,k,分别指示k位校验位的每个位
-
i q = i − 1 q=i-1 q=i−1(这一列可有可无) j = 2 q = 2 i − 1 j=2^q=2^{i-1} j=2q=2i−1 1 0 1 2 1 2 3 2 4 4 3 8 … … … k k-1 2 k − 1 2^{k-1} 2k−1 -
由映射公式容易发现校验位的分布位置(序号之间)满足等比数列
-
-
安排完校验位后,其余位( H i H_i Hi)用 信息位 D i D_i Di插入(按原信息位的序列顺序)
-
海明位序号(索引) 7 6 5 4 3 2 1 海明位 H 7 H_7 H7 H 6 H_6 H6 H 5 H_5 H5 H 4 H_4 H4 H 3 H_3 H3 H 2 H_2 H2 H 1 H_1 H1 校验位分布(位置) P 3 P_3 P3 P 2 P_2 P2 P 1 P_1 P1 信息位分布(位置) D 4 D_4 D4 D 3 D_3 D3 D 2 D_2 D2 D 1 D_1 D1 综上各位取值(校验位具体取值待求) 1 0 1 0
-
分组以形成校验关系
-
每个数据位 D i D_i Di用
多个校验位
( P i P_i Pi)进行校验-
多个表示,至少2个校验位(所以一般用到海明码的环境下, k ⩾ 2 k\geqslant{2} k⩾2)
-
为了便于讨论,称对于数据位(有效信息位)的校验行为校验任务,简称
任务
-
假设某个校验任务中使用了u个校验位
-
这u个校验位满足条件:
- 被校验数据位的
海明位号
等于校验该数据位的各校验位
的海明位号之和
- 这里强调的是
海明号之和
;也就是海明码在海明号序列下的下标之和之间的约束关系
- 被校验数据位的
-
Note:column header; j ( 校 验 位 P i 所 在 的 海 明 位 位 置 下 标 j = 2 i − 1 ) j(校验位P_i所在的海明位位置下标j=2^{i-1}) j(校验位Pi所在的海明位位置下标j=2i−1) 1 2 4 … 2 k − 1 2^{k-1} 2k−1 case1 case2 case3 … cases ( 2 k − k − 1 ) (2^{k}-k-1) (2k−k−1) - 这个表格设计的不是很好,有空在研究
- case也可记作task
- 表头的" j ( 校 验 位 P i 所 在 的 海 明 位 位 置 下 标 ) j(校验位P_i所在的海明位位置下标) j(校验位Pi所在的海明位位置下标)"这个应该放在 1 , 2 , 4 , ⋯ , 2 k − 1 1,2,4,\cdots,2^{k-1} 1,2,4,⋯,2k−1上面
- 但是markdown表格比较简单,且为了能够兼容latex,所以挪到左侧
- 也可以画树状图
- 根据组合数来做,最直接
- 这个表格设计的不是很好,有空在研究
-
根据排列组合的知识:
-
如果有k个校验位,则可以分配(搭配)的校验任务数上限🎈
-
U = ∑ i = 2 k ( k i ) = ( k 2 ) + ( k 3 ) + ⋯ + ( k k ) = ∑ i = 1 k ( k i ) − ∑ i = 2 k ( k i ) = 2 k − k − 1 U=\sum_{i=2}^{k}\binom{k}{i} =\binom{k}{2}+\binom{k}{3}+\cdots+\binom{k}{k} =\sum_{i=1}^{k}\binom{k}{i}-\sum_{i=2}^{k}\binom{k}{i} =2^{k}-k-1 U=i=2∑k(ik)=(2k)+(3k)+⋯+(kk)=i=1∑k(ik)−i=2∑k(ik)=2k−k−1
-
这个结论部分回答了为什么最初的n,k不等式的关系形式
-
-
-
回到本例
-
C 3 2 = 3 , C 3 3 = 1 , 共 有 3 + 1 = 4 个 校 验 任 务 C_3^2=3,C_3^{3}=1,共有3+1=4个校验任务 C32=3,C33=1,共有3+1=4个校验任务
- 这恰好就是信息位的位数n=4
- 只有当上限值 U ⩾ n U\geqslant{n} U⩾n,才能够保证,所有信息位都可以被校验!(分配到校验任务)
-
1 + 2 = 3 1+2=3 1+2=3,所以 H 1 , H 2 校 验 H 3 H_1,H_2校验H_3 H1,H2校验H3, H 3 = D 1 H_3=D_1 H3=D1
-
1 + 4 = 5 1+4=5 1+4=5,所以 H 1 , H 4 H_1,H_4 H1,H4校验 H 5 H_5 H5, H 5 = D 2 H_5=D_2 H5=D2
-
2 + 4 = 6 2+4=6 2+4=6,所以 H 2 , H 4 H_2,H_4 H2,H4校验 H 6 H_6 H6, H 6 = D 3 H_6=D_3 H6=D3
-
1 + 2 + 4 = 7 1+2+4=7 1+2+4=7,所以 H 1 , H 2 , H 4 H_1,H_2,H_4 H1,H2,H4校验 H 7 H_7 H7, H 7 = D 4 H_7=D_4 H7=D4
-
海明位序号(索引) 7 6 5 4 3 2 1 海明位 H 7 H_7 H7 H 6 H_6 H6 H 5 H_5 H5 H 4 H_4 H4 H 3 H_3 H3 H 2 H_2 H2 H 1 H_1 H1 校验位分布(位置) P 3 P_3 P3 P 2 P_2 P2 P 1 P_1 P1 信息位分布(位置) D 4 D_4 D4 D 3 D_3 D3 D 2 D_2 D2 D 1 D_1 D1 信息位校验任务分配 H ( 1 , 2 , 4 ) = P 1 , 2 , 3 H_{(1,2,4)}=P_{1,2,3} H(1,2,4)=P1,2,3 H ( 2 , 4 ) = P 2 , 3 H_{(2,4)}=P_{2,3} H(2,4)=P2,3 H ( 1 , 4 ) = P 1 , 3 H_{(1,4)}=P_{1,3} H(1,4)=P1,3 H ( 1 , 2 ) = P 1 , 2 , 3 H_{(1,2)}=P_{1,2,3} H(1,2)=P1,2,3
-
-
-
校验位不需要再被校验🎈
根据校验位分组
- 从各个校验位的角度来看
- 每个校验位被分配了若干任务,称为校验位 P i P_i Pi的任务组
- 每个需要被校验的信息位需要若干个(2个以上的)校验位提供校验基础
- 从各个校验位的角度来看
求解校验位取值
-
海明位序号(索引) 7 6 5 4 3 2 1 海明位 H 7 H_7 H7 H 6 H_6 H6 H 5 H_5 H5 H 4 H_4 H4 H 3 H_3 H3 H 2 H_2 H2 H 1 H_1 H1 校验位分布(位置) P 3 P_3 P3 P 2 P_2 P2 P 1 P_1 P1 信息位分布(位置) D 4 D_4 D4 D 3 D_3 D3 D 2 D_2 D2 D 1 D_1 D1 信息位取值 1 0 1 0 信息位校验任务(包含的海明位/校验位) H ( 1 , 2 , 4 ) = P 1 , 2 , 3 H_{(1,2,4)}=P_{1,2,3} H(1,2,4)=P1,2,3 H ( 2 , 4 ) = P 2 , 3 H_{(2,4)}=P_{2,3} H(2,4)=P2,3 H ( 1 , 4 ) = P 1 , 3 H_{(1,4)}=P_{1,3} H(1,4)=P1,3 H ( 1 , 2 ) = P 1 , 2 H_{(1,2)}=P_{1,2} H(1,2)=P1,2 校验位分组(参与校验的信息位)(统计量) D 2 , 3 , 4 D_{2,3,4} D2,3,4 D 1 , 3 , 4 D_{1,3,4} D1,3,4 D 1 , 2 , 4 D_{1,2,4} D1,2,4 -
根据各个校验位所参与的校验组校验位的值
-
校验位 P i P_i Pi的值为第
i
组信息位所有组内位求异或- 第i组信息位组是指:由校验位 P i P_i Pi参与校验的数据位
-
本步骤中获得完整海明码
校验位取值
-
取D= D 4 , D 3 , D 2 , D 1 D_4,D_3,D_2,D_1 D4,D3,D2,D1=1010
-
D 4 D_4 D4 D 3 D_3 D3 D 2 D_2 D2 D 1 D_1 D1 1 0 1 0
-
-
校验位 P i P_i Pi的值为第i组(由该校验位校验的数据位)所有位求异或(XOR)
根 据 上 述 的 分 组 有 P 1 = D 1 ⊕ D 2 ⊕ D 4 = 0 ⊕ 1 ⊕ 1 = 0 P 2 = D 1 ⊕ D 3 ⊕ D 4 = 0 ⊕ 0 ⊕ 1 = 1 P 3 = D 2 ⊕ D 3 ⊕ D 4 = 1 ⊕ 0 ⊕ 1 = 0 根据上述的分组有\\ \begin{array}{l} P_{1}=D_{1} \oplus D_{2} \oplus D_{4}=0 \oplus 1 \oplus 1=0 \\ P_{2}=D_{1} \oplus D_{3} \oplus D_{4}=0 \oplus 0 \oplus 1=1 \\ P_{3}=D_{2} \oplus D_{3} \oplus D_{4}=1 \oplus 0 \oplus 1=0 \end{array} 根据上述的分组有P1=D1⊕D2⊕D4=0⊕1⊕1=0P2=D1⊕D3⊕D4=0⊕0⊕1=1P3=D2⊕D3⊕D4=1⊕0⊕1=0
- 所以, 信息序列1010 对应的海明码为
101
0
‾
0
10
‾
101 \underline{0} 0 \underline{10}
1010010
- 注意,异或运算有结合律
- (下画线为校验位, 其他为信息位)
海明码的校验(使用)
判断对错
- 利用各组内的奇偶校验(也是求亦或XOR的过程)来检查
- 将构成K个方程
- Hamming Code=101
0
010
- Hamming Code=101
每 个 校 验 组 分 别 利 用 校 验 位 和 参 与 形 成 该 校 验 位 的 信 息 位 进 行 奇 偶 校 验 检 查 , 构 成 k 个 校 验 方 程 : S 1 = P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 S 2 = P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 S 3 = P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查, 构成 k 个校验 方程: \\ \begin{array}{l} S_{1}=P_{1} \oplus D_{1} \oplus D_{2} \oplus D_{4} \\ S_{2}=P_{2} \oplus D_{1} \oplus D_{3} \oplus D_{4} \\ S_{3}=P_{3} \oplus D_{2} \oplus D_{3} \oplus D_{4} \end{array} \\ 每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查,构成k个校验方程:S1=P1⊕D1⊕D2⊕D4S2=P2⊕D1⊕D3⊕D4S3=P3⊕D2⊕D3⊕D4
- 若 S 3 S 2 S 1 S_{3} S_{2} S_{1} S3S2S1 的值为 “ 000 ”, 则说明无错;
- 否则说明出错, 且这个数就是错误位的位号,
- 如 S 3 S 2 S 1 = 001 S_{3} S_{2} S_{1}=001 S3S2S1=001 , 说明第 1 位出错, 即 H 1 H_{1} H1 出错,
纠错
- 纠错:直接将出错的位取反就达到了纠错的目的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了