開発ツールを整える
初級チェックデジットを整える。
= 番号の最後の1桁が「合っているか」を、桁ごとの計算で確かめる
チェックデジットが初めての方は、先に そもそもチェックデジットとは・どんな場面で使うか をどうぞ。
アニメで見る — チェックデジットが決まるしくみ 開くと1ステップずつ動きます
桁ごとに重み
位置で1・2などを掛ける
全部足す
折り返しも含めて合計
余りで決定
割った余りからCDを算出
STEP 1
※ 図はLuhn(クレジットカード等)を例にしたイメージです。下の入力欄で実際の数字を試せます。
① 種類を選んで番号を入れる
⚠️ 本物のクレジットカード番号や、自分・他人のマイナンバーを入力しないでください。下の「テスト用番号を生成」で作った番号で試せます。
「テスト用番号を生成」は乱数から作った架空の番号です。実在のカード・個人・法人・書誌・商品とは無関係です。
② 判定
番号を入力してください
入力されたチェックデジット
—
計算されたチェックデジット
—
計算の流れ図
各桁の上から「桁の数字」「掛ける重み」「積」。最後に合計から判定までを矢印でつないでいます。
番号を入力すると、ここに流れ図が出ます。
桁ごとの内訳
| 位置 | 桁 | 重み | 積 | 折り返し後 | 累計 |
|---|---|---|---|---|---|
| 番号を入力すると内訳が出ます | |||||
そもそもチェックデジットとは
番号の中に仕込まれた、1桁の「検算用の数字」。
チェックデジット(check digit、検査用数字)は、番号のほかの桁から決まった計算で求めた数字を、番号の一部として付け足したものです。番号を書き写したりタイプしたりするときに数字を間違えると、計算結果が合わなくなるので、人が見直さなくても機械がすぐ「この番号はおかしい」と気づけます。
身近なたとえでいえば、「買い物の合計を検算する」ようなものです。クレジットカード番号、マイナンバー、法人番号、本のバーコード(ISBN = International Standard Book Number、国際標準図書番号)、商品のバーコード(JAN = Japanese Article Number)など、身の回りの番号に広く使われています。
どこで・どんな場面で使うか
-
ネットショップでカード番号を入力するとき
1桁打ち間違えた段階で、決済の前に「番号が正しくありません」と表示されます。
-
書店や図書館で本を探すとき
裏表紙のバーコード(ISBN)を読み取り、読み取りミスがあれば弾かれる仕組みです。
-
コンビニやスーパーのレジ
商品の JAN コードを読み取るとき、汚れや読み取り不良による誤った番号を見逃しません。
-
会社の手続きで法人番号やマイナンバーを入力するとき
手入力の誤りを、送信する前に画面側で見つけられます。
-
在庫や顧客の番号を手で入れる業務システム
入力した番号に間違いがあれば、その場で止められます。
知らないと何が困るか
- 「通った」=「実在する」ではない。チェックデジットが合っていても、その番号が実際に発行されたものとは限りません。形が正しいだけで、本物の保証ではありません。
- 入力ミスが後から発覚して手戻りになる。仕組みを知らないと、間違った番号が処理の奥まで進んでから問題になります。
- システムを作る側が、検算を入れ忘れる。入力欄で一番簡単に防げるミスなのに、対策がないまま公開してしまう例があります。
上のツールで、種類を選んで番号を入れ、桁ごとの計算がどうなるか確かめてみてください。
解説
チェックデジットは「1桁の入力ミス」をほぼ確実に見つける。
チェックデジットは、他の桁の数字から決まった計算式で1つに定まる「検算用の数字」です。番号を書き写す・タイプするときに誰かが1桁だけ数字を間違えると、その桁の値が変わることで合計(または余り)も必ず変わるため、狙って同じ結果に化けさせない限り、単純な1桁の入力ミスはこの検算だけで机上検出できます。上の「①1桁変える」ボタンの代わりに、自分で番号の1桁を書き換えて試すと、必ず❌になることが確認できます。
一方で「万能」ではありません。よく知られた弱点が隣接する2桁の入れ替え(transposition)です。Luhn(クレジットカード等)の場合、多くの隣接入れ替えは検出できますが、隣り合う桁が「9」と「0」の組み合わせのときだけは、入れ替えても合計が変わらず検出できません(例: …09… ↔ …90… の入れ替え)。これは重み2側で9を掛けて折り返す(18→9)計算と、重み1側で0を置く計算がどちらも「9」になり、桁の位置を入れ替えても総和が変わらないために起きる、この方式に特有の盲点です。
各方式の定義と一次出典
- Luhnアルゴリズム(クレジットカード番号・IMEI等)
- 末尾を1桁目として右から交互に重み1・2を掛け、積が10以上になったら9を引いて折り返す。全桁の合計が10の倍数ならOK。出典: ISO/IEC 7812-1(附属書A)。
- 個人番号(マイナンバー・12桁)
- 下11桁を右からP1〜P11とし、重みQ(n)(n≦6ならn+1、n≧7ならn−5)を掛けた合計を11で割った余りrを求める。r≦1なら検査用数字は0、それ以外は11−r。出典: 総務省告示 平成26年総務省告示第85号。
- 法人番号(13桁)
- 先頭1桁が検査用数字。残り12桁を右からP1〜P12とし、右から数えて奇数位置は重み1・偶数位置は重み2を掛けた合計を9で割った余りrを求め、9−rが検査用数字になる。出典: 国税庁「法人番号の構成」(法人番号の指定等に関する取扱いに基づく)。
- ISBN-10(旧規格)
- 左から1〜10桁目に重み10,9,…,1を掛けた合計が11の倍数ならOK。10桁目が「10」になるときは「X」と表記する。出典: ISO 2108(旧版)。
- ISBN-13 / JAN-13(EAN-13と同一)
- 左から1〜13桁目のうち奇数位置は重み1、偶数位置は重み3を掛けた合計が10の倍数ならOK。ISBN-13は書籍、JAN-13は日本国内の商品バーコードだが、計算式は共通(国際規格EAN-13)。出典: ISO 2108 / JIS X 0501。
- JAN-8(EAN-8と同一)
- 左から1〜8桁目のうち奇数位置は重み3、偶数位置は重み1を掛けた合計が10の倍数ならOK。JAN-13/ISBN-13と奇数・偶数の重みが逆になる点に注意。出典: JIS X 0501。
⚠️ 入力した番号はこの端末から一切送信されません(送信ゼロ)。計算はすべてブラウザ内のJavaScriptで完結します。本ツールは検算の学習・確認用であり、実在のカード・個人・法人の真正性を保証するものではありません。
このツールについて
番号の最後(または先頭)の1桁は、他の桁から計算できる「チェックデジット」であることが多い、という話です。クレジットカード番号・マイナンバー・法人番号・ISBN・JANコードで、実際にどう計算されているかを、桁ごとの重み・積・合計・余りまで内訳表で確認できます。
番号の最後(または先頭)の1桁は、他の桁から計算で決まる検算用の数字。Luhn(クレジットカード)・マイナンバー・法人番号・ISBN・JANの7方式に対応し、桁ごとの重み・積・合計・余りを内訳表で確認。「テスト用番号を生成」で架空の番号を作って試せる。送信ゼロ。
主な機能
- Luhn(クレジットカード等)・マイナンバー・法人番号・ISBN-10/13・JAN-13/8の7方式に対応
- 桁ごとの重み・積・折り返し・累計を内訳表で可視化(しくみの図解つき)
- 1桁の入力ミスを検出できる理由と、検出できない既知の例(隣接9↔0の入れ替え)を解説
- テスト用番号のワンクリック生成(実在のカード・個人・法人とは無関係な乱数)
- 入力欄の直上に本物の番号を入れないよう固定の注意書き
- 計算はすべてブラウザ内・送信ゼロ
- 桁×重み=積から合計・余り・判定までを流れ図で表示
よくある質問
Q. チェックデジットとは何ですか?
A. 番号の最後(方式によっては先頭)の1桁で、他の桁から決まった計算式(重みを掛けて足し、割った余りを見る)で1つに定まる「検算用の数字」です。入力ミスの検出に使われます。
Q. 1桁だけ間違えたら必ず見つかりますか?
A. はい。このツールが対応する7方式(Luhn・マイナンバー・法人番号・ISBN-10/13・JAN-13/8)はいずれも、1桁だけ数字が変わると合計または余りが必ず変わる作りになっており、単純な1桁の入力ミスは検出できます。
Q. 隣り合う2桁を入れ替えても検出できますか?
A. 方式によって既知の例外があります。Luhn(クレジットカード等)では、隣り合う桁が「9」と「0」の組み合わせのときだけ、入れ替えても合計が変わらず検出できません。それ以外の入れ替えは多くの場合検出できます。
Q. 自分のマイナンバーやクレジットカード番号を試していいですか?
A. おすすめしません。入力欄の直上に注意書きがあるとおり、本物の番号は入力せず「テスト用番号を生成」で作った架空の番号(実在の人・カードとは無関係な乱数)で試してください。計算自体は送信ゼロ(ブラウザ内で完結)です。
Q. マイナンバーと法人番号のチェックデジットは同じ計算式ですか?
A. いいえ、別々の式です。マイナンバー(個人番号12桁)は総務省告示 平成26年第85号の mod 11 の式(末尾がチェックデジット)、法人番号(13桁)は国税庁の構成に基づく mod 9 の式(先頭がチェックデジット)で、重みの掛け方も異なります。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。