概要
チェックキャラクタは、チェックデジットとも言われ、データの信憑性を確認するためにデータの最後に付加するキャラクタである。チェックキャラクタは、一般的に各桁の値の総和を求め、それを桁数で割った余りを利用するが、その演算方法は、モジュロ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場合のチェックデジットを求める。
(1) データの右側を奇数位置とし、奇数桁を2倍する。
(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