數據校驗碼--漢明碼(Hamming code)

漢明碼是Richard Hamming于1950年提出的。是目前廣泛采用的一種有效的校驗碼,其中,主存的ECC(Error Correcting Code)采用的就是類似的校驗碼。

基本原理

將有效的信息按某種規律分成若干組,每組安排一個校驗位,做奇偶測試,就能提供多位檢錯信息,以指出最大可能是哪位出錯,從而將其糾正。實質上,漢明校驗碼是一種多重校驗。

----摘自百度百科
這個分組的思想有點不是很理解。

在有效信息位種中加入幾個校驗位形成漢明碼,使碼距比較均勻的增大,并把漢明碼的每一個二進制位分配到幾個奇偶校驗組中。

以下使用P代表校驗位,H代表漢明碼,D代表原始信息位,N位信息位的位數,K位校驗位的位數。
則N與K的關系為2^(K-1) >=N+K+1,如下表:

N K
1~3 4
4~10 5
11~25 6
26~56 7
57~119 8

分組原則

  • 信息位和校驗位之和為m,每個校驗位Pi在漢明碼中被分到位號為2^(i-1)的位置上,其余各位為信息位
  • 漢明碼每一位Hi有多個校驗位校驗,其關系是被校驗的每一位位號等于校驗它的各校驗位的位號之和,即漢明碼的實質是參與校驗的各校驗位權之和。 這句話理解起來有點別扭,看下面例子。
  • 在增大碼距時,應使所有編碼的碼距盡量均勻地增大,以保證對所有代碼的檢測能力平衡的提高

例子

編碼

假設原始數據信息位的位數為8,那么他需要的K值位5,即需要有5個校驗位,組成的漢明碼的位數為13.再根據校驗位的分配原則,組成的漢明碼如下:

|位|13| 12| 11 |10| 9| 8| 7 |6| 5| 4| 3| 2| 1|
|-|-|-|-|-|-|-|-|-|-|-|-|-|
|漢明碼|P5| D8| D7| D6 | D5| P4| D4| D3| D2| P3| D1| P2| P1|

P5本來應該是放在第16位的,但是由于生成的漢明碼位數為13所以它就被挪到的第13位了。
那么怎么確定校驗呢?最初也困擾我許久。
先看一個表格:
其中H的下標代表在漢明碼中的位置,也是P4P3P2P1組成的-十進制數

P5 P4 P3 P2 P1 H
0 0 0 1 H1 P1
0 0 1 0 H2 P2
0 0 1 1 H3 D1
0 1 0 0 H4 P3
0 1 0 1 H5 D2
0 1 1 0 H6 D3
0 1 1 1 H7 D4
1 0 0 0 H8 P4
1 0 0 1 H9 D5
1 0 1 0 H10 D6
1 0 1 1 H11 D7
1 1 0 0 H12 D8
1 1 0 1 H13 P5

校驗位Pi的偶校驗結果就是:
P1 = D1 ^ D2 ^ D4 ^ D5 ^ D7
P2 = D1 ^ D3 ^ D4 ^ D6 ^ D7
P3 = D2 ^ D3 ^ D4 ^ D8
P4 = D5 ^ D6 ^ D7 ^D8
如果是奇校驗的話上面的結果取反就是了。
那么還有P5呢?上面的結果中,D4,D7出現了3次,而D1,D2,D3,D5,D6,D8僅出現了2次,為了使其各個信息位在校驗中均勻的出現校驗,從而定義P5 = D1 ^ D2 ^ D3 ^ D5 ^ D6 ^D8,這樣,每一位信息位都均勻的出現在3個Pi值得形成關系中,當任意一位信息位變化的時候都會引起3個P值得變化,即合法漢明碼的碼距為4 (前面都懂,這個碼距為4有點想不明白)
這就是編碼了。

現在再來看看這句話

漢明碼每一位Hi有多個校驗位校驗,其關系是被校驗的每一位位號等于校驗它的各校驗位的位號之和,即漢明碼的實質是參與校驗的各校驗位權之和。

P1,P2,P3,P4,P5的位數分別為1,2,4,8,13
D1的漢明碼位數為3,3 = 2 + 1所以D1會被P1,P2兩個校驗位所校驗。

漢明碼的信息位 漢明碼的位數 被校驗位 說明
D1 3 = 1 + 2 P1,P2 D1信息位會被校驗位P1,P2所校驗。
D2 5 = 1 + 4 P1,P3
D3 6 = 2 + 4 P2,P3
D4 7 = 1 + 2 +4 P1,P2,P3
D5 9 = 1+ 8 P1,P4
D6 10 = 2 + 8 P2,P4
D7 11 = 1 + 2 +8 P1,P2,P4
D8 12 = 4 + 8 P3,P4

根據偶校驗結果以及上應該就清楚了。

校驗

將收到的漢明碼進行偶校驗(當然也可以進行奇校驗,前提是前面編碼的時候使用的是奇校驗)

S1 = P1 ^ D1 ^ D2 ^ D4 ^ D5 ^ D7
S2 = P2 ^ D1 ^ D3 ^ D4 ^ D6 ^ D7
S3 = P3 ^ D2 ^ D3 ^ D4 ^ D8
S4 = P4 ^ D5 ^ D6 ^ D7 ^D8
S5 = P5 ^ D1 ^ D2 ^ D3 ^ D5 ^ D6 ^D8

漢明碼出錯情況:
記錄 S = S5 S4 S3 S2 S1

  1. S為00000時代表無錯
  2. 有一位不為0,表明某一校驗位出錯或者三位漢明碼(信息位和校驗位)同時出錯
  3. 兩位不為0,表明兩位漢明碼同時出錯,此時只能發現錯誤無法確定錯誤的位置
  4. 3位不為0,表明一位信息位出錯或者3位校驗位同時出錯
  5. 4/5位不為0,表明出錯情況嚴重,系統可能出現故障,應檢查系統硬件的正確性

以上結果分析基于偶校驗。

|漢明碼||P5| D8| D7| D6 | D5| P4| D4| D3| D2| P3| D1| P2| P1|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|出錯位號||H13| H12| H11 |H10|H9| H8| H7 |H6| H5| H4| H3| H2|H1|
||S5|1|1|0|1|1|0|0|1|1|0|1|0|0|
||S4|0|1|1|1|1|1|0|0|0|0|0|0|0|
||S3|0|1|0|0|0|0|1|1|1|1|0|0|0|
||S2|0|0|1|1|0|0|1|1|0|0|1|1|0|
||S1|0|0|1|0|1|0|1|0|1|0|1|0|1|

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 獨立磁盤冗余數組(RAID, Redundant Array of Independent Disks)簡稱硬盤陣...
    yekai閱讀 4,945評論 0 14
  • 海明(漢明)碼是廣泛采用的一種有效的校驗碼,它實際上是一種多重奇偶校驗碼。 海明碼的原理就是在有效信息位中加入幾個...
    Julianlee107閱讀 17,763評論 0 6
  • 大家好!我是咩咩麻麻,我的采訪對象是繪畫小能手,為寶寶畫繪本的姜小靜同學。 為什么是小靜同學呢?這源于總群...
    Nicole_李孟洋閱讀 533評論 0 0
  • 1.先查看系統上有沒有安裝了舊版本的MySQL,用下面的命令: rpm -qa | grep mysql 如果有,...
    小利同學閱讀 615評論 0 51
  • tyger老師的拼讀英語教的好,粉絲是那么的多,孩子們媽媽們家長們都非常喜歡。他的突破和革新是在認知方面:單詞是由...
    悅心心得閱讀 1,498評論 1 8