バーコードのチェックディジットの仕組み (EAN-13, UPC-A, EAN-8)
あなたが買うほとんどの商品のバーコードでは、最後の数字は実は商品番号の一部ではありません — それはチェックディジットで、スキャンや入力の誤りを検出するために他の数字から計算された一桁の数字です。本ガイドでは、最も一般的な3つの小売形式 — EAN-13、UPC-A、EAN-8 — でこの数字がどう働くかを、手で追える計算例とともに解説します。
チェックディジットの目的
チェックディジットは組み込みの冗長性の一種です。バーコードのデータ桁はすでに商品を識別しており、チェックディジットは商品そのものについて新しい情報を加えません。代わりに、すべての桁の間に成り立つべき関係を符号化します。そのため、スキャナーがバーを誤読したり人が番号を打ち間違えたりすると、その関係が崩れ、誤りが黙って受け入れられるのではなく即座に検出されます。
小売バーコードが使う方式は GS1 モジュロ10 です。レジのスキャナーが一日に何千回も瞬時かつ確実に検証しなければならないため、数回の掛け算と一回の引き算で意図的に単純に設計されています。
GS1 モジュロ10 アルゴリズム
最後のチェックディジットを除くすべての桁を取ります。そのデータ桁の最も右から左へ進みながら、桁に3と1を交互に掛けます。すべての積を足します。チェックディジットは、その合計を次の10の倍数にするために加えるべき値です。
式で書くと: チェック = (10 − (重み付き合計 mod 10)) mod 10。外側の 'mod 10' は合計がすでに10の倍数である場合を処理し、そのときチェックディジットは0になります。
- 重みは最も右のデータ桁から 3, 1, 3, 1 … と交互に適用されます。
- 最後の桁だけがチェックディジットで、その前はすべてデータです。
- EAN-13、UPC-A、EAN-8 はすべて同じアルゴリズムを使い、長さだけが異なります。
計算例
EAN-13 データ 400638133393(12桁。13桁目がチェックディジット)を見ます。右から 3, 1, 3, 1 … と重み付けすると、積は 3×3 + 9×1 + 3×3 + 3×1 + 3×3 + 1×1 + 8×3 + 3×1 + 6×3 + 0×1 + 0×3 + 4×1 となり、合計すると89です。
89 より大きい次の10の倍数は90なので、チェックディジットは 90 − 89 = 1 です。完全な有効バーコードは 4006381333931 です。もしスキャナーが最後の桁を7と読んでいたら、再計算したチェックが一致せず、その場で読み取りが拒否されます。
なぜ3で重み付けすると誤りをより多く検出できるのか
3という交互の重みは恣意的なものではありません。単純な桁の合計でも一桁の誤りは検出できますが、非常によくある人為的な誤り — 隣り合う2桁の入れ替え(例: 21 を 12 と打つ)— は見逃します。交互の位置に3を掛けると、入れ替わった隣同士の桁に異なる重みが与えられるため、ほとんどの入れ替えは合計を変え、検出されます。
一桁のチェックディジットだけで、ありうるすべての誤りを検出することはできません — 重み3のモジュロ10は、差が5の2桁の入れ替えや、たまたま相殺する2つの誤りを見逃します。これは最も頻繁な誤りに対する安価で高速な安全策であり、暗号学的な保証ではありません。
EAN-13、UPC-A、EAN-8
3つの形式は長さだけが異なります。EAN-13 はデータ12桁+チェック1桁で、世界標準です。北米で一般的な UPC-A はデータ11桁+チェック1桁で、実際には先頭に0が付いた EAN-13 です。EAN-8 は、完全なバーコードが入らない小さな品目のために、データ7桁+チェック1桁を短いシンボルに収めます。
3形式はモジュロ10アルゴリズムを共有するため、同じ計算で3つすべてを検証できます。必要なのは桁数を知ることだけです。バーコードとして印刷された13桁の ISBN も EAN-13 であり、まさにこのチェックディジットを使うため、本のバーコードも豆の缶詰と同じ方法で検証できます。