パリティチェックの基礎と応用:偶数/奇数パリティからRAID・ECCまでの検出と訂正の仕組み

パリティチェックとは何か — 基本概念

パリティチェック(parity check)は、データ通信や記憶装置で利用される最も基本的な誤り検出手法の一つです。あるビット列に対して「パリティビット」という1ビットを付加し、送受信や読み書きの際にデータの奇偶性を確認して誤りの有無を判定します。計算は単純で、実装コストが低く、ハードウェア上ではXORゲート1つで済むため広く使われてきました。

基本的な動作原理

パリティには主に「偶数パリティ(even parity)」と「奇数パリティ(odd parity)」の2種類があります。偶数パリティでは、データ中の1の数とパリティビットを合わせた総数が偶数になるようにパリティビットを設定します。奇数パリティでは総数が奇数になるようにします。

例:データビットが 1011001(1の個数 = 4、偶数)の場合

  • 偶数パリティ:パリティビット = 0(そのまま偶数)
  • 奇数パリティ:パリティビット = 1(総数が5で奇数に)

受信側は受け取ったビット列のパリティを再計算し、期待される奇偶性と一致しなければ誤りが発生したと判断します。

数学的(線形符号)な見方

パリティビット付加は、2値体(GF(2))での線形符号の一種です。データをベクトル x とすると、単一パリティのチェックはすべて1の成分を持つ行ベクトル H(すなわち H·x^T = 総XOR)に対応します。受信データ y に対するシンドローム s = H·y^T が 0(ゼロベクトル)ならパリティ検査合格、非ゼロなら誤り検出となります。

パリティの種類と拡張

  • 単一ビット(1ビット)パリティ

    各データ単位(例えば1バイト)に1ビットのパリティを付ける最も単純な形式。通信(シリアルポート/UART等)や古いパリティRAMで用いられます。

  • 縦横(2次元)パリティ(2Dパリティ)

    データを行列状に並べ、各行にパリティ、各列にパリティを付ける方式。単一ビット誤りを検出かつ位置特定できるため、単一ビット誤りを訂正する簡易的手段になりますが、複数ビット誤り(特に同一行・列で偶数箇所)には弱いです。

  • 長手・横手冗長チェック(LRC、縦のパリティ)

    シリアル通信で用いられることがあり、バイト列ごとのXORを取ることでブロック全体のパリティを出します。ブロック内の奇数個の誤りは検出可能です。

  • RAIDでのパリティ(XORパリティ)

    ディスクアレイ(RAID4/RAID5等)ではブロック単位のXORでパリティブロックを構成します。複数ディスクの対応ブロックをXORすればパリティが得られ、故障ディスクの再構築は残りのディスクのXORで復元できます(ただし複数障害には制約あり)。

誤り検出能と限界

単一パリティの最も重要な性質は「ビット反転の総数が奇数であれば検出できる」ことです。逆に、偶数個のビット反転はパリティが保存されるため検出できません。したがって、単一パリティは単ビット誤りや偶数個誤りの検出率が低い環境では不十分です。

また、パリティは誤りの訂正能力を持ちません(単一ビット位置を特定して訂正する情報を持たない)。2次元パリティやハミング符号のような拡張コードでは単一ビット訂正や複数ビット検出が可能になりますが、その分ビットオーバーヘッドや実装の複雑さが増します。

ハミング符号とSECDED

ハミング符号は複数のパリティビットを特定の位置に配置し、各パリティがチェックするビット集合を工夫することで、単一ビット誤りの検出と訂正(Single Error Correction: SEC)が可能な線形符号です。これにさらに全体パリティを付けて「SECDED(Single Error Correct, Double Error Detect)」とすれば、1ビットを訂正しつつ2ビット誤りを検出できます。ECCメモリで一般的に用いられる手法の一つです。

実装と計算コスト

パリティ計算はXOR(排他的論理和)演算の繰り返しであり、計算量は線形 O(n)(n = ビット数)です。ハードウェアでは多数のXORゲートを並列に使うことで高スループットに実装できます。ソフトウェアではCPUのビット演算命令(例えばx86のPOPCNTやビット演算での累積XOR)を用いると効率的です。

用途と実例

  • シリアル通信(UART)のパリティビット:最低限の誤り検出に利用。
  • 古いパリティRAM:メモリの単ビット誤り検出に利用(しかし訂正は不可)。
  • RAID(特にRAID4/RAID5):XORによる分散/集中パリティでディスク障害からの復元に利用。
  • 簡易ファイル転送プロトコルやデータ単位のチェック:軽量でオーバーヘッドが小さい。

パリティとCRC等の比較

CRC(巡回冗長検査)は多項式除算に基づいた検査で、バーストエラーにも強く、検出能力が高いです。EthernetやUSB、ほとんどのネットワークプロトコルではCRCが使われます。対してパリティは計算が極めて軽く、単ビット誤りや単純環境での軽微なチェックには有用ですが、検出性能は限定的です。用途によりトレードオフが選ばれます。

実務上の設計上の注意点

  • エラー強度が高い環境(ノイズが多い回線や高確率のバーストエラー)ではパリティだけでは不十分。CRCやECCを検討する。
  • ディスクやストレージでのサイレントデータ破損対策には、単純パリティよりもCRCや強いチェックサム、あるいはECCや整合性検証(ハッシュ)を用いるのが望ましい。
  • RAIDにおけるパリティ再計算のI/Oボトルネックや書き込みペナルティ(特にRAID5の「読み-修正-書き戻し」)を理解すること。

まとめ

パリティチェックはその単純さと低コストが最大の利点で、単一ビット誤りの検出や軽量な整合性チェックには十分有効です。一方で、偶数個の誤りを検出できない、訂正できないなどの根本的な制約があります。今日の多くのシステムでは、用途や信頼性要件に応じてパリティ、ハミング/ECC、CRC、あるいはそれらの組合せを選択することで、性能と信頼性のバランスを取っています。

参考文献