「チェックデジット」とは
チェックデジットとは
チェックデジットは、チェックキャラクタともいわれ、データの信憑性を確認するためにデータの最後に付加するキャラクタである。
チェックデジットは一般的に各桁の値の総和を求め、それを桁数で割った余りを利用するが、その演算方法はモジュロ10(Modulo 10)やモジュロ43(Modulo 43)などさまざまである。モジュロをモジュラス(modulus)ともいう。
チェックデジットはJAN/EANやCode128のようにあらかじめシンボルに組み込まれているもの、Code39やインターリーブド2 of 5のようにシンボルに組み込まれていないが、チェック方法が標準化されているもの、Codabar(NW-7)のようにチェック方法が標準化されているにもかかわらず、現実的にはさまざまなチェック方法が利用されているもの、そしてCode 2 of 5のように全く規定されてないものがある。チェックデジットが標準化されている場合は、バーコードリーダの機能で素早くデータチェックできる。
通常チェックデジットはバーコードシンボルの読み取りが正しく実行したかをチェックするために利用される。しかしEDIデータを複数のバーコードシンボルで表示する場合は、EDIデータ全体のチェックデジットをシンボルチェックデジットの前に付加する場合がある。
インターリーブド2 of 5やマトリックス2 of 5はキャラクタ構成がシンプルであるために誤読が発生しやすい。特にキャラクタが消滅する「桁落ち」が多く発生するので、チェックデジットを付加しない場合でも桁数チェックだけは必須である。
チェックデジットの効果
チェックデジットなしの場合と付けた場合の誤読率はどのくらいの差があるのだろうか。
1981年に米国国防総省がCode39を物流シンボルLOGMARSに採用する際、凸版印刷、写真印刷、ドットプリンタ等のさまざまなラベルを混ぜてテストしている。その結果は、チェックデジットなしが約300万キャラクタに1キャラクタの誤読に対しチェックデジット付きでは1億4900万キャラクタに1キャラクタになったと報告されている。
また、1981年に米国血液銀行共通化委員会CCBBA(The Committee for Commonality in Blood Banking Automation)はCodabar(NW-7)についてテストしている。その結果は、チェックデジットなしで150万キャラクタに1キャラクタに対しチェックデジット付きでは特別に誤読率が増加した10日間を除けば、910万キャラクタに1キャラクタであったと報告されている。
モジュロ10/ウェイト3
モジュロ10/ウェイト3は数字のみのチェック方式で、キャラクタに3,1,3,1とウェイトを掛けていき、キャラクタの総和が10の倍になる値をチェックデジットとする。
具体的には、数値をモジュラスで割って得られた余りをモジュラスから差し引いた数値(補数)をチェックデジットとする。JAN/EAN、UPC、インターリーブド2 of 5等に使用されている。その計算方法を次に示す。
(1) データキャラクタの中で最も右にあるキャラクタを奇数とし、全てのデータキャラクタを奇数位置と偶数位置に分類する。
(2) 奇数位置にあるキャラクタを3倍する。
(3) 偶数位置にあるキャラクタを1倍する。
(4) 手順(2)の結果と手順(3)の結果を合計する。
(5) 手順(4)の結果を10で割り、余りを求める。
(6) 10から手順(5)の結果の余りを引いた数字がチェックデジットである。なお、手順(5)の答えの余りが0の場合は、チェックデジットは0となる
(7) インターリーブド 2 of 5は、データとチェックデジットの合計が偶数桁でなければならないので、奇数桁の場合は、データの前に0を付加する。
例:JAN-8のデータが4912349の場合のチェックデジットを求める。
(1) データキャラクタの中で最も右にあるキャラクタを奇数とし、全てのデータキャラクタを奇数位置と偶数位置に分類する。
(2) 奇数位置にあるキャラクタをそれぞれ3倍、偶数位置にあるキャラクタを1倍する。
(3) 奇数位置と偶数位置の数字を合計する。
12+9+3+2+9+4+27=66
(4) (3)の結果を10で割り、余りを求める。
66÷10=6余り6
(5) 10から(3)の結果の余りを引く。
10-6=4
したがって、このチェックデジットは4である。
モジュロ10/ウェイト2
モジュロ10/ウェイト2は数字のみのチェック方式で、キャラクタに2,1,2,1とウェイトを掛けていき、それらの総和が10の倍数になる値をチェックデジットとする。
具体的には、数値をモジュラスで割って得られた余りをモジュラスから差し引いた数値(補数)をチェックデジットとする。Codabar(NW-7)やOCRに使用されることがある。その計算方法を次に示す。
(1) データキャラクタの中で最も右にあるキャラクタを奇数とし、全てのデータキャラクタを奇数位置と偶数位置に分類する。
(2) 奇数位置にあるキャラクタをそれぞれ2倍して合計する。この時、2桁になった数字は、10の位と1の位を分離して別に合計する。
(3) 偶数位置にあるキャラクタを合計する。
(4) 手順(2)の結果と手順(3)の結果を合計する。
(5) 手順(4)の合計の結果を10で割り、余りを求める。
(6) 10から手順(5)の結果の余りを引いた数字がチェックデジットである。なお、手順(5)の答えの余りが0の場合は、チェックデジットは0となる。
例:Codabar(NW-7)のデータが6031492場合のチェックデジットを求める。
(2) 各桁を合計する。
1+2+0+6+1+8+9+4=31
(3) (2)の結果を10で割り、余りを求める。
31÷10=3余り1
(4) 10から(3)の結果の余りを引く。
10-1=9
したがって、このチェックデジットは9である。
モジュロ11/ウェイト2,3,4,5,6,7
モジュロ11は数字データのみのチェック方式で、キャラクタに2,3,4,5,6,7とウェイトを掛け、それらのキャラクタの総和が、10の倍数になる値をチェックデジットとする。
具体的には、数値をモジュラスで割って得られた余りをモジュラスから差し引いた数値(補数)をチェックデジットとする。
モジュロ11はCodabar(NW-7)やOCRに使用されることがある。モジュロ11はデータに欠番ができるため連番管理には不都合であるが、モジュラス10に比べ隣合う左右の数字が入れ替わる時(転倒エラー)や1桁おいて左右の数字が入れ替わる時(複転レラー)に検出率が高い。その計算方法を次に示す。
(1) データキャラクタの中で最も右にあるキャラクタから順に2,3,4,5,6,7を繰り返し、ウェイトを付ける。(これ以外のウェイトの付けたもある。)
(2) データのそれぞれの数値に手順(1)で付けたウェイトを乗じる。
(3) 手順(2)の結果の全てを合計する。
(4) 手順(3)の合計の結果を11で割り、余りを求める。
(5) 11から手順(4)の結果の余りを引いた数字がチェックデジットである。なお、手順(4)の答の余りが0の場合は、チェックデジットは0とし、余りが1の場合は10となるためこのデータは欠番とする。
例:Codabar(NW-7)のデータが1526734の場合のチェックデジットを求める。
(1) データの右側を奇数位置とし、2,3,4,5,6,7と順にウェイトを付ける。
(2) 各桁を合計する。
2+35+12+30+28+9+8=124
(3) (2)の結果を11で割り、余りを求める。
124÷11=11余り3
(4) 11から3)の結果の余りを引く。
11-3=8
したがって、このチェックデジットは8である。
DR(Divide Remains)チェック
DRチェックはキャラクタ列を数値とし、それをモジュロで割って得られた余りをチェックデジットとする方式である。7DRは総和を7で割り、9DRは総和を9で割る。
7DRチェックはCodabar(NW-7)の連続番号シールや宅配便の伝票番号に使用されている。エラー検出率はあまり高くないが、計算式が容易なので使いやすい。
例:7DRで1234のチェックデジットを求める。
(1) データキャラクタ列を数値にする。
1234
(2) 手順(1)の結果を7で割り、余りを求める。
1234÷7=176余り2
(3) この余り2をチェックデジットとする。
DSR(Divide Supply Remains)チェック
DSRチェックはキャラクタ列を数値とし、それがモジュロの倍数になる値を求める方式である。
具体的には、数値をモジュラスで割り、その余りをモジュロから差し引いた数値(補数)をチェックデジットとする。7DSRは総和を7で割り、9DSRは総和を9で割る。
例:7DSRで1234のチェックデジットを求める。
(1) データキャラクタ列を数値にする。
1234
(2) 手順(1)の結果を7で割り、余りを求める。
1234÷7=176余り2
(3) この余り2を7から引いた結果5をチェックデジットとする。但し、結果が7になった場合は、0とする。
7-2=5