ECC、汉明码、SEC-DED 是什么?
更新时间:2026-09-21。问题驱动短答页。编码与实现见 Hamming/ECC,存储可靠性与巡检见 ECC 巡检 RAS。
一句话回答
ECC(纠错码)给数据加若干校验位,使每一位的翻转都会让接收方算出一个独特的“校验子”(syndrome)。汉明码用 r 个校验位覆盖 2^r−1 位、其中数据位 2^r−r−1,能纠正任意一个比特的翻转(SEC,single-error correcting);在汉明码基础上再加一位全局偶校验得到 SEC-DED,可在纠正单错的同时检测出双比特错(double-error detecting)。但它不能纠正双比特错——双错只报警不纠错;要防多比特软错误需更宽的码(BCH/RS)、位交织和定期 scrubbing。
需要多少校验位
汉明码不等式:2^r ≥ m + r + 1(m 数据位、r 校验位)。例如 64 位数据常用 7+1 位做 SEC-DED(共 72 位)。
- 校验子为 0:无错。
- 校验子非零且与某一位的编码吻合:单错,定位并翻转纠正(SEC)。
- 增加的总校验位配合整体奇偶:若校验子非零但总奇偶显示“偶数位错”,判为双比特错 → 报不可纠正(DED),避免把双错误纠成另一个单错。
码距决定能力
最小码距 d 决定:检错 d−1 位、纠错 ⌊(d−1)/2⌋ 位。汉明 SEC-DED 码距为 4,所以“纠 1、检 2”。要纠更多位要用码距更大的 BCH(可纠多比特)或 Reed-Solomon(擅长突发错误)。
用在哪里、怎么加固
- SRAM/寄存器堆/cache:宇宙粒子引发单比特翻转(SEU),ECC 在线纠一检二,见 RAM/ROM 推断。
- 位交织(bit interleaving):把逻辑相邻位在物理上打散,让一次多位物理扰动落到不同 ECC 字、各自表现为单错,从而可纠。
- scrubbing(巡检):后台周期读出、纠正并写回,防止单错累积成不可纠的双错。
- 与奇偶校验、CRC 分工:奇偶只检 1 位不纠错;CRC 强于通信突发检错但不定位,见 LFSR/CRC。
常见坑
- 以为 SEC-DED 能纠双比特错:它只能检双错、不能纠。
- 只在写入时算 ECC、读取不校验,等于没保护。
- 不做 scrubbing,长时间运行后单错叠加成双错。
- 校验位/总奇偶实现错误,把双错误纠成第三个位置,静默数据损坏。
总结
ECC 通过校验位让每一位翻转对应唯一校验子,汉明码满足 2^r ≥ m+r+1、可纠正任意单比特错(SEC),再加一位全局校验得到码距 4 的 SEC-DED,实现纠一检二;它无法纠正双比特错,多比特防护要靠 BCH/RS、物理位交织和后台 scrubbing,与只检不纠的奇偶、擅长突发检错的 CRC 各有分工。