バーコードの下の数字の、最後の1桁の役割 〜チェックデジット〜

送信するときにチェック用のデータを追加して、受信した側でチェックに使う

大学入試センターが公開している、情報科の共通テスト試作問題に、「パリティビット」「パリティチェック」を扱った問題があります。

「パリティビット」「パリティチェック」とは、通信でやりとりしたいデータのビットの並びに、「正しくデータを受け取ったか」をチェックするためのビットを追加するアイデアのことを言います。

 

あらかじめ決められたルールに基づいて、データのビットの並びから計算すると、チェック用のビットの値が決まります。

試作問題の第1問・問2では、「送信データの1の個数を数え、偶数個ならパリティビット0を、奇数個ならパリティビット1を付け足す」というルールを使っています。

送信側と受信側で、同じデータを元に、同じ計算をすれば、チェック用の値も同じになるはずです。試作問題の例で言えば、受信したデータ(例:「01000110」)について、1の個数を数え、偶数個なら0、奇数個なら1が最後に付いているはず…(例では、「1」)と考えるわけです。

もし、送信側でつけたチェック用の値と、受信側でデータから計算して求めたチェック用の値が同じにならなかったら、通信の際に、データかチェック用のデータのどちらかが壊れた、ということになります。受信した側は、壊れているデータを破棄するか、送信側に再送を求めるなどの対応ができます。

簡単ですが、賢い仕組みです。

ところで、「データを書き込む時に、本来扱いたい値の他に、チェック用の値を追加して、読み取り側でチェックするのに使う」というアイデアは、通信以外の場面でも使われています。

その代表が、このブログ記事で紹介する商品コードのチェックデジットです。

13桁の商品コード

消しゴムや、ボールペン、ふせんなどの商品には、バーコードが印刷されています。これをレジのスキャナで読むと、商品の種類や値段が分かる…というのは、文具店の店頭などで見たことがあるでしょう。

バーコードの下をよく見ると、数字が並んでいることが分かります。商品によって違いますが、13桁のもの、8桁のものがあります(※サイズが小さい商品では、数字が印字されていない場合もあります)。

消しゴムの商品コード

スティックのりの商品コード

先頭が「49」で始まるものばかりだな、と気づくかもしれません(「45」で始まる商品を見つけた人もいるかもしれません)。

このバーコードの下に印字されている数字は、商品に割り当てられたコードで、一般に「商品コード」と呼ばれます。世の中には、様々な種類の商品コードがありますが、いま日本国内で最も普及している商品コードは、JANコード(ジャンコード)です。

実は、JANコードの先頭3桁は国を表しており、「49」や「45」は、日本を示す数字なのです。

※商品コード、JANコードの詳細については、一般財団法人流通システム開発センターのWebサイトなどをご覧ください。

なお、ここまでの説明では、「バーコードの下に数字がある」というふうに、バーコードのおまけに数字が付いているかのように説明してきました。しかし、実は話は逆で、JANコードの数字を、機械(バーコードスキャナ)で読み取りやすいように、白黒の線の形にしたものがバーコードです。

13桁の商品コード(JANコード)の最後の1桁の役割

以下では、13桁のJANコードを取り上げます。

13桁の数値のうち、先頭の3けたが国を表すことを上で紹介しましたが、実は最後の1桁は、前の12桁の値から計算して求める値です。「パリティビット」、「パリティチェック」と同じ考え方なのです。

計算のルールは次の図の通りです。

チェックデジットの計算ルール https://www.gs1jp.org/code/jan/check_digit.html から引用

JANコードをスキャナで読み取って、読み取りに間違いが無いかどうかは、前の12桁の値から計算した値と、最後の桁の値(チェックデジットと呼ばれます)が一致するかどうかを調べればいいようになっています。

チェックデジット計算機

次に示す「チェックデジット計算機」と名付けたアプリをご覧ください。

サンプルプログラム「チェックデジット計算機」

※このアプリは、このページの一番最後に掲載しているボタンを使って、Monaca Educationにインポートできます。ぜひ、ソースコードも見てみてください。

12桁の数値を入力して、「計算する」ボタンをクリックすると、チェックデジットの計算をして、値を表示します。

手元の商品のJANコードを途中まで(12桁まで)入力して計算させ、実際のJANコードの末尾の値と比べてみてください。

また、わざと間違えて(手元の商品のJANコードの特定の桁に、元とは違う値を入力して)計算させてみてください。結果はどのようになるでしょうか?

ある桁を1大きくして入力した場合は?逆に1小さく入力した場合はどうなるでしょうか?並んだ2つの桁を続けて間違えた場合はどうでしょうか?

チェックデジットはいつでも完璧に誤りを見つけられる?

いくつか、わざと間違えて入力して試してみると、いつでも誤りを検知できるわけではない(=正しいJANコードのチェックデジットと、間違って入力した場合のチェックデジットの値が同じになる)ことが分かるはずです。

チェックデジットという仕組みは、元々は12桁の値に、わざわざ1桁余計な値を付け足します。これによって誤りを発見することを狙っています(実際に、多くの場合で、誤りがあることは見つけられます)。

ですが、いつでも誤りが発見できるわけでは無いことを確認しましょう。元のデータの量に対して、ほんの数%のデータと、わずかな回数の計算を追加するだけでは、誤りの検知は完全には行えないのです。

Monaca Educationにインポートする(要ログイン)