アルゴリズム
algorithm
標準
チェックデジット

[メモ] 各種チェックデジットの計算方法

チェックデジットの計算方法

  • 桁数の多い数字を扱う場合、誤り検知用にチェックデジット(検証番号)といわれるものがあります。大抵は末尾についていたりします。
  • いくつか計算方法をメモしておきます。
  • 以下の計算の元になる数値は、チェックデジットを除いたものです。
  • 実運用上は、少しだけ違う変形版のチェックデジットが使われていることがあります。

モジュラス10 ウェイト2・1分割(Luhn formula)

  1. 数値の各桁に、下の桁から2・1・2・1・…の順番に係数(ウェイト)を掛けます。
  2. 各桁の結果が2桁の場合には、十の位と一の位を分けて足し合わせます(分割)。
  3. それぞれの合計を求めます。
  4. 合計を10で割り、余りを求めます(モジュラス)。
  5. この余りを 10 から引いたもの(10 - 余り)がチェックデジットです。ただし余りが0の場合はチェックデジットも「0」になります。

例として 20151119 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9
係数 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2
数字×係数 2 0 1 10 1 2 1 18
分割 2 0 1 1 + 0 1 2 1 1 + 8
項目 計算式
合計 2 + 0 + 1 + 1 + 0 + 1 + 2 + 1 + 1 + 8 = 17 17
余り 17 ÷ 10 = 1 余り 7 7
チェックデジット 10 - 7 = 3 3

もう一つの例として 20151149 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 4 9
係数 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2
数字×係数 2 0 1 10 1 2 4 18
分割 2 0 1 1 + 0 1 2 4 1 + 8
項目 計算式
合計 2 + 0 + 1 + 1 + 0 + 1 + 2 + 4 + 1 + 8 = 20 20
余り 20 ÷ 10 = 2 余り 0 0
チェックデジット (余りが0のため) 0

使用例:

  • クレジットカード番号 - Wikipedia:ISO/IEC 7812
  • IMEI (International Mobile Equipment Identity) - Wikipedia:IMEI

モジュラス10 ウェイト2・1一括

  1. 数値の各桁に、下の桁から2・1・2・1・…の順番に係数(ウェイト)を掛けます。
  2. 各桁の結果の合計を求めます。
  3. 合計を10で割り、余りを求めます(モジュラス)。
  4. この余りを 10 から引いたもの(10 - 余り)がチェックデジットです。ただし余りが0の場合はチェックデジットも「0」になります。

例として 20151119 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9
係数 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2
数字×係数 2 0 1 10 1 2 1 18
項目 計算式
合計 2 + 0 + 1 + 10 + 1 + 2 + 1 + 18 = 35 35
余り 35 ÷ 10 = 3 余り 5 5
チェックデジット 10 - 5 = 5 5

もう一つの例として 20151169 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 6 9
係数 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2
数字×係数 2 0 1 10 1 2 6 18
項目 計算式
合計 2 + 0 + 1 + 10 + 1 + 2 + 6 + 18 = 40 40
余り 40 ÷ 10 = 4 余り 0 0
チェックデジット (余りが0のため) 0

モジュラス10 ウェイト3・1

  1. 数値の各桁に、下の桁から3・1・3・1・…の順番に係数(ウェイト)を掛けます。
  2. 各桁の結果の合計を求めます。
  3. 合計を10で割り、余りを求めます(モジュラス)。
  4. この余りを 10 から引いたもの(10 - 余り)がチェックデジットです。ただし余りが0の場合はチェックデジットも「0」になります。

例として 20151119 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9
係数 × 1 × 3 × 1 × 3 × 1 × 3 × 1 × 3
数字×係数 2 0 1 15 1 3 1 27
項目 計算式
合計 2 + 0 + 1 + 15 + 1 + 3 + 1 + 27 = 50 50
余り 50 ÷ 10 = 5 余り 0 0
チェックデジット (余りが0のため) 0

もう一つの例として 20151129 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 2 9
係数 × 1 × 3 × 1 × 3 × 1 × 3 × 1 × 3
数字×係数 2 0 1 15 1 3 2 27
項目 計算式
合計 2 + 0 + 1 + 15 + 1 + 3 + 2 + 27 = 51 51
余り 51 ÷ 10 = 5 余り 1 1
チェックデジット 10 - 1 = 9 9

使用例:

  • ISBN-13(新体系、2007年~) - Wikipedia:ISBN
  • 一般的な商品のバーコード(JAN/EANなど) - Wikipedia: EANコード
  • 牛の個体識別番号

モジュラス11 ウェイト2~7

  1. 数値の各桁に、下の桁から2~7の係数(ウエイト)を掛けます。7の次はまた2に戻ります。
  2. 各桁の結果の合計を求めます。
  3. 合計を11で割り、余りを求めます(モジュラス)。
  4. この余りを 11 から引いたもの(11 - 余り)がチェックデジットです。ただし余りが0または1の場合はチェックデジットも「0」になります。

例として 20151119 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9
係数 × 3 × 2 × 7 × 6 × 5 × 4 × 3 × 2
数字×係数 6 0 7 30 5 4 3 18
項目 計算式
合計 6 + 0 + 7 + 30 + 5 + 4 + 3 + 18 = 73 73
余り 73 ÷ 11 = 6 余り 7 7
チェックデジット 11 - 7 = 4 4

もう一つの例として 20151219 のチェックデジットを求めます。

元の数字 2 0 1 5 1 2 1 9
係数 × 3 × 2 × 7 × 6 × 5 × 4 × 3 × 2
数字×係数 6 0 7 30 5 8 3 18
項目 計算式
合計 6 + 0 + 7 + 30 + 5 + 8 + 3 + 18 = 77 77
余り 77 ÷ 11 = 7 余り 0 0
チェックデジット (余りが0のため) 0

さらにもう一つの例として 20152119 のチェックデジットを求めます。

元の数字 2 0 1 5 2 1 1 9
係数 × 3 × 2 × 7 × 6 × 5 × 4 × 3 × 2
数字×係数 6 0 7 30 10 4 3 18
項目 計算式
合計 6 + 0 + 7 + 30 + 10 + 4 + 3 + 18 = 78 78
余り 78 ÷ 11 = 7 余り 1 1
チェックデジット (余りが1のため) 0

使用例:

  • 個人番号(通称:マイナンバー) - 「平成26年総務省令第85号」pdf
  • 住民票コード - 「平成14年総務省告示第436号」
  • 運転免許証番号(10桁+チェックデジット1桁+再発行回数)

モジュラス11 ウェイト1~0

  1. 数値の各桁に、下の桁から1・2・3・…の係数(ウエイト)を掛けます。
  2. 各桁の結果の合計を求めます。
  3. 合計を11で割り、余りを求めます(モジュラス)。
  4. この余りを 11 から引いたもの(11 - 余り)がチェックデジットです。ただし余りが0または1の場合はチェックデジットも「0」になります。

例として 20151119 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9
係数 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1
数字×係数 16 0 6 25 4 3 2 9
項目 計算式
合計 16 + 0 + 6 + 25 + 4 + 3 + 2 + 9 = 65 65
余り 65 ÷ 11 = 5 余り 10 10
チェックデジット 11 - 10 = 1 1

もう一つの例として 20151128 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 2 8
係数 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1
数字×係数 16 0 6 25 4 3 4 8
項目 計算式
合計 16 + 0 + 6 + 25 + 4 + 3 + 4 + 8 = 66 66
余り 66 ÷ 11 = 6 余り 0 0
チェックデジット (余りが0のため) 0

さらにもう一つの例として 20151129 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 2 9
係数 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1
数字×係数 16 0 6 25 4 3 4 9
項目 計算式
合計 16 + 0 + 6 + 25 + 4 + 3 + 4 + 9 = 67 67
余り 67 ÷ 11 = 6 余り 1 1
チェックデジット (余りが1のため) 0

セブンチェック(7DR及び7DSR)

  1. 数値を7で割り、余りを求めます。この余りが 7DR (Divide Remainder)と呼ばれるチェックデジットです。
  2. この余りを7から引いたもの(7 - 余り)が 7DSR(Divide Subtract Remainder) と呼ばれるチェックデジットです。

例として 20151119 のチェックデジットを求めます。

項目 計算式
7DR 20151119 ÷ 7 = 2878731 余り 2 2
7DSR 7 - 2 = 5 5

使用例:

  • クロネコヤマト、佐川急便、日本郵便などの配送伝票番号(7DR)

ナインチェック(9DR及び9DSR)

  1. 数値を9で割り、余りを求めます。この余りが 9DR と呼ばれるチェックデジットです。
  2. この余りを9から引いたもの(9 - 余り)が 9DSR と呼ばれるチェックデジットです。

例として 20151119 のチェックデジットを求めます。

項目 計算式
9DR 20151119 ÷ 9 = 2239013 余り 2 2
9DSR 9 - 2 = 7 7

法人番号(通称:法人用マイナンバー)のチェックデジット

個人的には聞いたことの無いチェックデジット計算方法ですが(私が知らないだけかもしれませんが)、他のチェックデジット計算方法にならうなら「モジュラス9ウェイト1・2」でしょうか。
また、チェックデジットが先頭(左側)に付くこともちょっと変わっていますね。必ず13桁になるように、つまり先頭がゼロにならないようにしているのだと思いますが。

  1. 数値の各桁に、下の桁から1・2・1・2・…の順番に係数(ウェイト)を掛けます。
  2. 各桁の結果の合計を求めます。
  3. 合計を9で割り、余りを求めます(モジュラス)。
  4. この余りを9から引いたもの(9 - 余り)がチェックデジットです。

例として 201511192359 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9 2 3 5 9
係数 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1
数字×係数 4 0 2 5 2 1 2 9 4 3 10 9
項目 計算式
合計 4 + 0 + 2 + 5 + 2 + 1 + 2 + 9 + 4 + 3 + 10 + 9 = 51 51
余り 51 ÷ 9 = 5 余り 6 6
チェックデジット 9 - 6 = 3 3

ISBN-10 のチェックデジット

旧体系の ISBN-10 は、「モジュラス11 ウェイト10-2」とも呼ばれる独特のチェックデジット計算方法を持っています。

  1. 数値の各桁に、 上の桁 から10~2の係数(ウエイト)を掛けます(チェックデジット付きで10桁固定なので、下の桁から2~10の係数と考えても同じ)。
  2. 各桁の結果の合計を求めます。
  3. 合計を11で割り、余りを求めます(モジュラス)。
  4. この余りを 11 から引いたもの(11 - 余り)がチェックデジットです。結果が11(余りが0)の場合にはチェックデジットは0、結果が10(余りが1)の場合にはチェックデジットはXになります。

例として 201511191 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9 1
係数 × 10 × 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2
数字×係数 20 0 8 35 6 5 4 27 2
項目 計算式
合計 20 + 0 + 8 + 35 + 6 + 5 + 4 + 27 + 2 = 107 107
余り 107 ÷ 11 = 9 余り 8 8
チェックデジット 11 - 8 = 3 3

もう一つの例として 201511184 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 8 4
係数 × 10 × 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2
数字×係数 20 0 8 35 6 5 4 24 8
項目 計算式
合計 20 + 0 + 8 + 35 + 6 + 5 + 4 + 24 + 8 = 110 110
余り 110 ÷ 11 = 10 余り 0 0
チェックデジット (余りが0のため) 0

さらにもう一つの例として 201511193 のチェックデジットを求めます。

元の数字 2 0 1 5 1 1 1 9 3
係数 × 10 × 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2
数字×係数 20 0 8 35 6 5 4 27 6
項目 計算式
合計 20 + 0 + 8 + 35 + 6 + 5 + 4 + 27 + 6 = 111 111
余り 111 ÷ 11 = 10 余り 1 1
チェックデジット (余りが1のため) X

その他

他にも、いろいろあります(バーコードで使われるモジュラス16、モジュラス43、モジュラス103など)

チェックデジットの検証方法

チェックデジットを含む番号検証するには、チェックデジットを取り除いて再度チェックデジットを計算し、結果を突き合わせることでももちろん正誤を判定できます。

いくつかのチェックデジット方式では、より簡単にチェックデジットの正誤の検証ができるように設計されているものがあります。

モジュラス10系

モジュラス10系のチェックデジットは、各桁に重みをかけて(場合によっては加工してから)合計を求め、10で割った余りからチェックデジットを求めます。
この際、余りが0の場合はチェックデジットも0となり、それ以外の場合には10から余りを引いたものがチェックデジットになります。

これはつまり、「合計」にチェックデジットを加えたら、必ず10で割り切れることになります。
(これは、モジュラス9系も同様の考え方ができるはずです)

例を示します。
以下の「検証対象」は、上記の「元の数字」+「チェックデジット」です。
桁ごとに区切っている場合には、チェックデジットに (CD) を付けています。

モジュラス10 ウェイト2・1分割(Luhn formula)

検証対象 2 0 1 5 1 1 1 9 3(CD)
係数 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1
数字×係数 2 0 1 10 1 2 1 18 3
分割 2 0 1 1 + 0 1 2 1 1 + 8 3
項目 計算式
合計 2 + 0 + 1 + 1 + 0 + 1 + 2 + 1 + 1 + 8 + 3 = 20 20
余り 20 ÷ 10 = 2 余り 0 0

モジュラス10 ウェイト2・1一括

検証対象 2 0 1 5 1 1 1 9 5(CD)
係数 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1
数字×係数 2 0 1 10 1 2 1 18 5
項目 計算式
合計 2 + 0 + 1 + 10 + 1 + 2 + 1 + 18 + 5 = 40 40
余り 40 ÷ 10 = 4 余り 0 0

モジュラス10 ウェイト3・1

検証対象 2 0 1 5 1 1 1 9 0(CD)
係数 × 1 × 3 × 1 × 3 × 1 × 3 × 1 × 3 × 1
数字×係数 2 0 1 15 1 3 1 27 0
項目 計算式
合計 2 + 0 + 1 + 15 + 1 + 3 + 1 + 27 + 0 = 50 50
余り 50 ÷ 10 = 5 余り 0 0

法人番号(通称:法人用マイナンバー)のチェックデジット

検証対象 3(CD) 2 0 1 5 1 1 1 9 2 3 5 9
係数 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1 × 2 × 1
数字×係数 3 4 0 2 5 2 1 2 9 4 3 10 9
項目 計算式
合計 3 + 4 + 0 + 2 + 5 + 2 + 1 + 2 + 9 + 4 + 3 + 10 + 9 = 54 54
余り 54 ÷ 9 = 6 余り 0 0

モジュラス11系

残念ながらモジュラス11系は、モジュラス10系ほど簡単にはなりません。

モジュラス11系のチェックデジットも、各桁に重みをかけて合計を求め、11で割った余りからチェックデジットを求めます。
この際、余りが0と1の場合はチェックデジットが0となり、それ以外の場合には11から余りを引いたものがチェックデジットになります。

つまり、余りが1の場合には、チェックデジットを合計に加えても、11では割り切れません。

そのため、モジュラス11系の場合には、以下のどちらかの場合にチェックデジットが正しいと判断できます。

  • チェックデジットを「合計」に加えて、11で割り切れる場合
  • 上記が11で割った余りが 1 で、検証対象のチェックデジットが 0 の場合

チェックデジットを切り離して、再度チェックデジットを計算して突き合わせる方法とあまり変わらないかもしれません。

モジュラス11 ウェイト2~7

検証対象 2 0 1 5 1 1 1 9 4(CD)
係数 × 3 × 2 × 7 × 6 × 5 × 4 × 3 × 2 × 1
数字×係数 6 0 7 30 5 4 3 18 4
項目 計算式
合計 6 + 0 + 7 + 30 + 5 + 4 + 3 + 18 + 4 = 77 77
余り 77 ÷ 11 = 7 余り 0 0

モジュラス11 ウェイト1~0

検証対象 2 0 1 5 1 1 1 9 1(CD)
係数 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 × 1
数字×係数 16 0 6 25 4 3 2 9 1
項目 計算式
合計 16 + 0 + 6 + 25 + 4 + 3 + 2 + 9 +1 = 66 66
余り 66 ÷ 11 = 6 余り 0 0

セブンチェックおよびナインチェック

セブンチェックと、ナインチェックの場合、チェックデジットを切り離し、元の数字に足す(DSRの場合)あるいは引く(DRの場合)と、割り切れるようになります。

これも、計算して突き合わせるのとあまり変わらない気がします。
特に簡易的な電子回路やアセンブラなどで実装するような場合など、多い桁数の加減算よりも1桁ずつ処理していくほうがよほど簡単なケースもあります。

7DRの場合

  • 検証対象: 201511192
項目 計算式
余り (20151119 - 2) ÷ 7 = 2878731 余り 0 0

7DSRの場合

  • 検証対象: 201511195
項目 計算式
余り ( 20151119 + 5 ) ÷ 7 = 2878732 余り 0 0

9DRの場合

  • 検証対象: 201511192
項目 計算式
余り ( 20151119 - 2) ÷ 9 = 2239013 余り 0 0

9DSRの場合

  • 検証対象: 201511197
項目 計算式
余り ( 20151119 + 7 ) ÷ 9 = 2239014 余り 0 0

1桁ずつ計算する方法

python風に書くなら以下のような感じ。

def validate_7dsr(target):
    data = target[0:-1]
    result = 0
    for ch in data:
        num = ord(ch) - 0x30
        result = (result*10 + num) % 7
    if result != 0:
        result = 7 - result
    return ord(target[-1]) - 0x30  == result