データ伝送や保存の現場では、ノイズや媒体の劣化などによってビット誤りが発生することがあります。こうした誤りは、システムの信頼性を損なう要因になり得ます。そこで重要になるのが「誤り訂正符号」です。中でもハミング符号は、比較的少ない冗長ビット(パリティビット)で、1ビット誤りの訂正まで行える代表的な方式として知られています。本記事では、ハミング符号の基本的な考え方や仕組み、利用されやすい場面、拡張方式、さらに量子誤り訂正との関係まで、押さえておきたいポイントを整理します。
ハミング符号とは、データ伝送や保存の途中で生じる誤りを検出・訂正するための、誤り訂正符号(ECC: Error Correcting Code)の一種です。特に、1ビット誤りを訂正できる点が特徴として挙げられます。
ハミング符号では、元のデータ(情報ビット)に対して、誤り検出や訂正に用いる冗長ビットを追加します。この冗長ビットは一般にパリティビットと呼ばれます。
特徴的なのは、パリティビットの配置位置と、どのビットを対象に計算するかがあらかじめ規則として定められている点です。典型的には、パリティビットを2のべき乗の位置(1、2、4、8…)に配置し、受信側でパリティチェックを行ってシンドローム(誤り位置を示す手がかり)を求めます。
ハミング符号は「(n,k)」の形で表されることが多く、kビットの情報をnビットに符号化します。代表的な例は次のとおりです。
| 種類 | 特徴 |
|---|---|
| ハミング(7,4)符号 | 4ビットの情報に3ビットの冗長を加えて7ビットにする。1ビット誤りの訂正が可能。 |
| ハミング(15,11)符号 | 11ビットの情報に4ビットの冗長を加えて15ビットにする。1ビット誤りの訂正が可能。 |
| 拡張ハミング符号(SECDED) | 全体パリティを追加し、1ビット訂正(SEC)と2ビット誤り検出(DED)を行う構成(例:ハミング(7,4)に全体パリティを加えた(8,4)など)。 |
どの方式を選ぶかは、想定する誤りの頻度や種類、冗長ビットをどこまで許容できるか(通信効率や容量効率)によって決まります。
ハミング符号は、計算機や通信の分野で「誤りは避けられない」という前提に立ち、冗長性を利用して自動的に訂正する考え方を具体化した方式です。この発想は、その後の誤り訂正符号全体の発展にも影響を与えました。
ハミング符号は万能な方式というより、軽量な誤り訂正が求められる場面に向いた技術と位置づけられます。より高い訂正能力が必要な場合には、BCH符号やリードソロモン符号、LDPC符号などが選ばれることも多く、用途に応じた使い分けが前提になります。
代表例として挙げられるのが、サーバー向けのECCメモリです。一般的には、1ビット誤りは自動訂正し、2ビット誤りは検出して異常として扱う(SECDED)設計が採られます。小さな誤りを黙って見逃すのではなく、検出結果に応じて処理を分ける点が、信頼性向上につながります。
産業機器や車載機器、医療機器などでは、データの正確性が重要である一方、処理能力や実装規模に制約があります。こうした条件下で、比較的軽量な誤り訂正としてハミング符号が検討されることがあります。
通信では、誤りが単発で起きるのか、連続して発生するのかといった特性によって適切な方式が変わります。ハミング符号は、単発のビット誤りを想定した環境では有効ですが、誤りが多発する回線やバースト誤りが支配的な場合には、別の方式が適することもあります。
エンコードでは、情報ビットにパリティビットを加え、規則に沿った符号語を作成します。一般的なルールは次のとおりです。
対象となるビットは、ビット位置を2進数で表した際に、対応する桁が1になるかどうかで整理されます。
受信側では、符号語に対してパリティチェックを行い、その結果をまとめたものをシンドロームとして求めます。シンドロームが0であれば整合しており、0以外の場合はどこかに不整合があることを示します。
ハミング符号では、設計上、1ビット誤りであればシンドロームが誤り位置に対応するため、そのビットを反転することで訂正が可能です。
誤解されやすい点として、次の点を整理しておく必要があります。
ハミング符号は、誤りが少ない前提で効果を発揮する方式であり、誤り率や誤りの出方を踏まえて採用可否を判断することが重要です。
ハミング距離とは、2つのビット列を比較したときに異なるビットの個数を指します。たとえば「1011」と「1001」は1か所だけ異なるため、距離は1です。
誤り訂正符号では、符号語同士の最小ハミング距離が性能に直結します。最小距離をdとすると、
と整理できます。標準的なハミング符号の最小距離は3であり、1ビット訂正に対応します。拡張ハミング符号では全体パリティを追加することで最小距離が4となり、1ビット訂正と2ビット検出が可能になります。
ハミング符号は、より強力な誤り訂正符号へ発展する際の基礎として位置づけられます。代表的な方式には、拡張ハミング符号、BCH符号、リードソロモン符号、LDPC符号などがあります。
誤りの頻度や形態、許容できる遅延や計算量、冗長率といった条件に応じて、適切な方式が選択されます。
ハミング符号はハードウェアだけでなく、ソフトウェアによる実装も可能です。軽量な整合性チェックや、リソース制約のある環境での簡易的な誤り訂正など、用途によっては採用されることがあります。ただし、再送制御や暗号、認証との役割分担を考慮し、「誤り訂正を入れれば安全になる」といった理解にならないよう注意が必要です。
量子コンピュータでは、量子ビットが外乱に弱く、誤り訂正が実用化の鍵とされています。量子誤り訂正は古典の誤り訂正符号と同一ではありませんが、誤りを検出し、状態を復元するという考え方は共通しています。
古典のハミング(7,4)符号の構造を応用した量子誤り訂正符号も知られており、ハミング符号の発想は量子分野でも別の形で活かされています。
ハミング符号は、情報ビットにパリティビットを加え、受信側でシンドロームを用いて誤り位置を推定することで、1ビット誤りを訂正できる誤り訂正符号です。拡張ハミング符号(SECDED)とすることで、1ビット訂正と2ビット誤り検出を組み合わせた運用が可能になり、メモリやストレージなど信頼性が求められる場面で考え方が活かされます。一方で、誤りが多い環境では他方式が適する場合もあるため、誤りの特性と冗長率、計算量のバランスを見て使い分けることが重要です。
ハミング符号は、データ伝送や保存で生じる誤りを検出・訂正するための誤り訂正符号(ECC)の一種で、特に1ビット誤りの訂正が可能な点が特徴です。
標準的なハミング符号は、1ビット誤りを確実に訂正できるよう設計されています。
標準的なハミング符号では、2ビット誤りが起きると誤訂正につながる可能性があります。実務では、全体パリティを加えた拡張ハミング符号(SECDED)を用い、2ビット誤りは検出して異常として扱う設計が一般的です。
ハミング符号に全体パリティを追加し、1ビット誤りは訂正、2ビット誤りは検出する構成を指します。
パリティビットは、受信側で整合性を確認し、誤り位置を推定するための冗長情報です。
受信データに対してパリティチェックを行った結果をまとめたもので、1ビット誤りであれば誤り位置に対応する値になります。
2つのビット列を比較したときに異なるビットの個数を表す指標です。
4ビットの情報を7ビットに符号化することを意味し、冗長ビットを加えて符号語を作成します。
単発のビット誤りを想定した環境で、軽量な誤り訂正が求められる場合に検討されます。
量子誤り訂正は古典ECCとは異なりますが、誤りを検出・訂正するという考え方の面で共通点があります。古典のハミング符号の構造を応用した量子誤り訂正符号も知られています。