Skip to content

海明校验

约 581 字大约 2 分钟

2025-10-15

上周电脑坏了,没更周记,这周更。

最近计组学了海明校验,觉着还挺有意思。为什么需要这个东西懒得过多阐述,本质很简单。

构造

设数据位数为nn,校验码位数为kk,我们的kk要求满足:

2k1>=n+k2^k - 1 >= n + k

现在说说为什么是这样。假设我们传输的数据为:

10101101010110

我们如果使用奇偶检验错误率极高。但我们想如果引入多个校验位就可以降低检验的错误率。我们可以利用小小的数学性质,在每个22的幂次位置插上一个校验位,再通过异或运算就可以扩大覆盖面,容错率极高。

10101101010110中,n=7n = 7,所以我们算出k=4k=4。我们就在20,21,22,232^0,2^1,2^2,2^3处插入校验码。设校验码分别为x0,x1,x2,x3x_0, x_1, x_2, x_3,我们要传输的带海明校验码的数据即为x0x11x2010x3110x_0x_11x_2010x_3110

我们若要求xix_i的值,就要把传输数据的位数(从左往右由1开始升序)转为二进制后,所有第ii位(这里的ii是二进制算法,从右往左由0开始升序)为1对应的数全部异或。将异或后的值取反即为xix_i

比如x0x11x2010x3110x_0x_11x_2010x_3110中,我如果要算x1x_1,3,6,7,10,11位满足条件。这时将他们全部异或11010=01 \oplus 1 \oplus 0\oplus1\oplus0 = 0。所以x2=1x_2=1

疑问

你可能要问了,要是异或式子中取到了未知数怎么办?好问题。你可以再看看,取不取得到?

传输后检验

我们拿到传输过来的数据后,将每个校验码与对应的值异或运算,如果结果不为1则说明其对应的值出现了错误。可一个校验码对应多个值要怎么办呢?好消息是一个值也有可能对应多个校验码。你可以通过排除法来确定出问题的范围。

其实还有更简单的方法,我们可以将所有校验码的异或结果拼接成一个二进制数,这个二进制数对应的十进制数即为错误的位置。