錯誤更正碼(error-correcting code)
/ E-C-C /
位元是物理的:一道宇宙射線、一縷電氣雜訊,或一個老化的記憶體單元,都能把 0 翻成 1。如果你儲存或傳送原始位元,你無從得知翻轉發生過。解法是加上精心挑選的額外位元,讓資料攜帶它自己的自我檢查。錯誤更正碼為訊息加上冗餘位元,使得錯誤不僅顯眼、還能自動被定位與修復——就像一個句子寫得夠巧妙,使單一個錯字一目了然,且原本想寫的字可被還原。
從最簡單的構想開始:同位(parity)。加一個額外位元,設定成讓 1 的總數為偶數。現在若任一位元翻轉,計數就變成奇數,你便知道出了問題——但你說不出是哪一位,所以你能偵測一個錯誤卻無法更正它。躍向更正的關鍵是 Hamming 的構想:用數個同位位元,每個守護資料位元中一個重疊的子集,安排得讓每個可能的單位元錯誤,觸發一組獨一無二的失敗同位檢查。那組樣式就是壞掉那一位的二進位位址,所以你只要把它翻回去。對 k 個資料位元做單錯更正的 Hamming 碼,約需 log2(k) 個檢查位元;真實記憶體 ECC 通常用 SECDED 碼——單錯更正、雙錯偵測。
為什麼這很重要:ECC 是織進資料本身的可靠性,而且無處不在——伺服器記憶體(ECC DRAM)、磁碟與固態硬碟(每磁區存著強力碼)、光碟、網路封包、深空通訊。誠實的限制:碼是為一定數量的錯誤量身打造的。單錯更正碼在兩位元翻轉時會默默地修錯;每種碼都有一個門檻,超過它就失效、甚至「更正」成錯誤的值。更多保護要付更多冗餘位元與運算。ECC 不讓錯誤變成不可能——它讓常見的小錯誤隱形,讓較罕見的大錯誤至少可被偵測。
對位元組 0b0110010(三個 1,奇數)做同位:附上一個值為 1 的同位位元,湊成四個 1、偶數。若位元組到達時變成 0b0010010,其 1 的數目與同位位元不再吻合,這個不一致就標示出有錯。帶有額外檢查位元的 Hamming 碼則更進一步,指名是哪一位翻了,好讓接收端把它翻回原樣。
同位偵測一次翻轉;Hamming 的構想加上足夠的檢查位元,連定位與修復也辦到。
每種碼都有極限。一個遇上兩次同時翻轉的單錯更正碼,可能滿懷信心地「更正」成錯誤的值。ECC 降低未被偵測的毀損機率;它無法消除它。