數據校驗碼


差錯 (Error)

  • 數據在計算機內部進行計算、存取和傳送過程中,由於元器件故障或噪音干擾等原因,會出現差錯。

  • 以存儲為例

    • 硬故障(hard failure):永久性的物理故障,以至於受影響的存儲單元不能可靠地存儲數據,成為固定的“1”或“0”故障,或者在0和1之間不穩定地跳變。
      • 由惡劣的環境、制造缺陷和舊損引起
    • 軟故障(soft error):隨機非破壞性事件,它改變了某個或某些存儲單元的內容,但沒有損壞機器。
      • 由電源問題或α粒子引起。
  • 解決方案
    • 從計算機硬件可靠性入手,在電路、電源、布線等方面采取必要
    的措施,提高計算機的抗干擾能力
    • 采取數據檢錯和校正措施,自動發現並糾正錯誤。

糾錯(Error Correction)

  • 基本思想:存儲額外信息進行檢錯和校正。

  • 處理過程:

  • 數據輸入:使用函數 \(f\)\(M\) 位數據 \(D\) 上生成 \(K\) 位校驗碼 \(C\)

  • 使用函數 \(f\)\(M\) 位數據 \(D'\) 上生成新的 \(K\) 位校驗碼 \(C''\), 並和取出的 \(K\) 位碼 \(C'\) 進行比較。

  • 沒有檢測到差錯:使用 \(D'\)

  • 檢測到差錯且可以糾正:糾正 \(D'\) 得到 \(D''\),並用 \(D''\)

  • 檢測到差錯但無法修復:報告。

image-20210924231401750

奇偶校驗碼

  • 基本思想:增加一位奇偶校驗位來表示數據中的 1 的個數是奇數還是偶數。

  • 處理過程:假設數據 \(D=D_M....D_1\)

  • 數據輸入:

  • 奇校驗:\(C = D_M\oplus D_{M-1}...\oplus D_1\oplus 1\)

  • 偶校驗:\(C = D_M \oplus ...\oplus D_1\)

  • 數據輸出:

  • 奇校驗:\(C'' = D'_M\oplus ...\oplus D'_1\oplus 1\)

  • 偶校驗:\(C'' = D'_M\oplus ...\oplus D_1\)

  • 檢錯
    \(S = C'\oplus C''\)
    當 S = 0:沒有差錯或者差錯個數為偶數個。
    當 S = 1:差錯個數為奇數個。

  • 優點
    只需要 1 位額外位,代價低。

  • 缺點
    無法發現偶數個差錯的情況,而且無法校正。(因為並不能定位差錯的位置)

  • 適用於較短的數據(比如1個字節)的檢錯:因為在短數據內出現多個差錯的可能性較小。

在奇偶校驗碼的基礎上,我們對一個數據的位分組,分別使用奇偶校驗碼,就得到了海明碼。

海明碼

  • 基本思想:把數據分成 K 組,對每一組都使用奇偶校驗碼進行糾錯。
  • 處理過程:
    為輸入數據 D 的每組產生一位奇偶校驗碼,得到 K 位奇偶校驗碼 C 。
    為輸出數據 D' 的每組產生一位奇偶校驗碼,得到 K 位奇偶校驗碼 C''
  • 檢錯:將 C'' 和取出的 C' 按位異或得到 K 位故障字 (syndrome word)

接下來要考慮的問題就是,如何分組,要分多少組。
我們先來考慮要分多少組。

對於檢錯結果有以下的情況:

  1. 校驗位中出現 1 位錯誤。 K 種情況
  2. 數據中出現 1 位錯誤 M 種
  3. 沒有錯誤 1 種情況

因此,要表示這么多情況,K,M 必然滿足如下不等式 \(2^K \ge M+K+1\)

故障字的作用
• 每種取值都反映一種情形(數據出錯 / 校驗碼出錯 / 未出錯)
• 規則
• 全部是0:沒有檢測到錯誤
• 有且僅有1位是1:錯誤發生在校驗碼中的某一位,不需要糾正
• 有多位為1:錯誤發生在數據中的某一位,將𝐷′中對應數據位
取反即可糾正(得到𝐷")

那么接下來的一個重要的問題是:如何對數據進行划分?
• 數據位划分
• 假定數據位為8位 𝐷 = 𝐷8 … 𝐷2𝐷1, 校驗碼為4位𝐶 = 𝐶4𝐶3𝐶2𝐶1
• 數據位/校驗碼與故障字的關系

• 數據位划分
𝐶1 = 𝐷1 ⊕ 𝐷2 ⊕ 𝐷4 ⊕ 𝐷5 ⊕ 𝐷7
𝐶2 = 𝐷1 ⊕ 𝐷3 ⊕ 𝐷4 ⊕ 𝐷6 ⊕ 𝐷7
𝐶3 = 𝐷2 ⊕ 𝐷3 ⊕ 𝐷4 ⊕ 𝐷8
𝐶4 = 𝐷5 ⊕ 𝐷6 ⊕ 𝐷7 ⊕ 𝐷8
該如何理解以上的公式呢?
首先我們需要引入一個假設,那就是數據位和校驗碼加起來形成的信息最多只有一位出錯,這是合理的,因為在這種短數據里,如果硬件沒問題,多位出錯的概率很小。
如果 4 位故障字中只有一個 1,那么說明 C',C'' 有且僅有 1 位不同,再結合假設,可知是對應校驗位出錯。
要明白如何分組,我們看 \(D_i\) 對應的故障字,比如 \(D_1\), 它對應的故障字是 0011,第一個數據位出錯會導致這種故障字的產生,可知 \(D_1\) 會影響 \(C_1,C_2\),因此在 \(C_1,C_2\) 的計算式中要包含 \(D_1\), 其他的也是以此類推。
• 位安排
• 將位設置在與其故障字值相同的位置

• 示例
• 假定8位數據字為𝐷=01101010,在生成海明碼時采用偶校驗
• 校驗位計算如下
𝐶1 = 𝐷1 ⊕ 𝐷2 ⊕ 𝐷4 ⊕ 𝐷5 ⊕ 𝐷7 = 0 ⊕ 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1
𝐶2 = 𝐷1 ⊕ 𝐷3 ⊕ 𝐷4 ⊕ 𝐷6 ⊕ 𝐷7 = 0 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1
𝐶3 = 𝐷2 ⊕ 𝐷3 ⊕ 𝐷4 ⊕ 𝐷8 = 1 ⊕ 0 ⊕ 1 ⊕ 0 = 0
𝐶4 = 𝐷5 ⊕ 𝐷6 ⊕ 𝐷7 ⊕ 𝐷8 = 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0
• 存儲時的12位內容
011001010011

• 獲取時的12位內容
• 情形1: 011001010011
𝐷′=01101010 𝐶′′=0011, 𝐶′=0011
𝑆 = 𝐶′′ ⊕ 𝐶

= 0011⨁0011 = 0000
• 情形2: 011101010011
𝐷′=01111010 𝐶′′=1010, 𝐶′=0011
𝑆 = 𝐶′′ ⊕ 𝐶

= 1010⨁0011 = 1001
• 情形3: 011011010011
𝐷′=01101010 𝐶′′=0011, 𝐶′=1011
𝑆 = 𝐶′′ ⊕ 𝐶

= 0011⨁1011 = 1000

循環冗余校驗

• 奇偶校驗問題: 額外成本很大,要求將數據分成字節
• 循環冗余校驗(Cyclic Redundancy Check, CRC)
• 適用於以流格式存儲和傳輸大量數據
• 用數學函數生成數據和校驗碼之間的關系
• 基本思想
• 假設數據有M位,左移數據K位(右側補0),並用K+1位生成多項
式除它(模2運算)
• 采用K位余數作為校驗碼
• 把校驗碼放在數據(不含補的0)后面,一同存儲或傳輸
• 校錯
• 如果M+K位內容可以被生成多項式除盡,則沒有檢測到錯誤
• 否則,發生錯誤

NOTE: MOD2 除法
MOD 2 除法的一種理解方法是用 MOD2 減法來實現,在 MOD 2 減法中,1-0=0-1=1,1-1=0-0=0,可以看出,其實就是異或運算。每次減去除數的一個若干倍數,最后直到無法再相減,即被減數有效位數小於減數。

例:110011000/1001
110011000-100100000 = 111000
111000 - 100100 = 11100
11100 - 10010 = 1110
1110 - 1001 = 111
因此最后余數為 111

總結

•糾錯
•數據出錯的原因,糾錯的原理和處理過程
•常用的數據校驗碼
•奇偶校驗碼
•海明碼
•循環 冗余校驗碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM