0x00
在过去一年的工作里,大多数时间都在做的内容是私有化交付,大概就是 Bazel 打包某些应用到 Linux 下部署,开发的任务相对其他同学来说比较少,也很久没有接触到算法了。
最近被分配到另一个组里(data组)也就是数据持久化的一个组,然后我在悄悄学习一些数据相关的技术。
今天本来是想上网去找EC算法(ErasureCode)的资料,结果突然看到了 ECC 内存使用的汉明码,然后突然想起来,以前学校里学过这个东西,但是只停留在怎么用这个层级,不知道原理是什么。
今天我们来回顾一下学生知识:
0x01
假设我们有一组数据要传输或者储存,为了计算方便我们将数据的长度设置为11位,也就是说11个数据位
假设数据就是 0010 0011 010
然后我们会在这些数据里去插入一些校验位,分别在 $2^0, 2^1, 2^2, 2^3$ 加入四个校验位。
为了方便,我把数据放进表格里,然后打上标志
A0 | A1 | A2 | 0 |
---|---|---|---|
A3 | 0 | 1 | 0 |
A8 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
我先说不说 A 相关的比特位的产生规则,我先直接填充上。
0 | 1 | 1 | 0 |
---|---|---|---|
1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
并且把所有表格按照二进制顺序排序,0000,0001,0010,0011……1111,
然后把所有1位置对应的二进制描述全部按顺序列出来
0001
0010
0100
0110
1000
1011
1100
1110
上面这些数位按位异或,就会得到0000,校验就会成功。
0x02
书上说这么校验,但是我一直不知道为什么,知道看了茶谈硬件的视频以后才知道。
x | 1 | 2 | 3 | 4 |
---|---|---|---|---|
A0 | A1 | A2 | 0 | |
A4 | 0 | 1 | 0 | |
A8 | 0 | 0 | 1 | |
1 | 0 | 1 | 0 |
刚才个表格是这样生成的,A1 是用来给