メニュー

番号検証の仕組み:文字種・桁数・チェックディジット

番号検証の仕組みを、文字種・桁数・チェックディジットの三層に分けて整理します。形式が通ることと実在することの違い、四つの結論の使い分けまでを順に確認できます。

公開日

  • 番号検証
  • チェックディジット

番号検証の仕組みは、思っているより単純な三層の重ね合わせです。文字種を確かめ、桁数を確かめ、最後にチェックディジットを計算する。この三層はそれぞれ別の種類の誤りを捕まえるので、順番を入れ替えると結論がおかしくなります。この記事では、検証が何を保証し、何を保証しないのかを切り分けて整理します。

番号検証とは何か?

番号検証とは、入力された文字列が、ある制度の規則に照らして自己矛盾していないかを確かめる作業です。規則は大きく三つの層に分かれます。

  • 文字種の層。使ってよい文字が決まっています。数字だけの制度もあれば、英字を含む制度もあります。
  • 桁数の層。全体の長さが決まっていれば、短すぎる入力や長すぎる入力はここで落ちます。
  • チェックディジットの層。末尾の一位を残りの位から計算し、一致するかを見ます。

三層はどれか一つで十分ではありません。桁数だけ合っていても文字種が違えば番号ではなく、文字種と桁数が合っていてもチェックディジットが成立しなければ入力ミスが残っている可能性があります。逆に、三層すべてを通ったとしても、その番号が実際に発行されたかどうかは何も分かりません。

三層を順に通す理由

順番には意味があります。まず区切り記号を落として正規化し、次に文字種と桁数を見て、最後にチェックディジットを計算します。この順序を守らないと、存在しない誤りを報告してしまいます。

たとえば、空白を残したまま桁数を数えると、正しい番号を「桁数が足りない」と判定します。英字を大文字に揃えずに照合すると、同じ番号が二通りに扱われます。チェックディジットを先に計算してしまうと、桁数が明らかに違う入力に対しても「計算が合いません」という、原因を誤解させるメッセージが出ます。利用者に直しようのない指摘を返さないためにも、軽い検査から重い検査へ進むのが基本です。

なぜ「形式が通る」ことは「本物」を意味しないのか?

ここが最も誤解されやすい点です。チェックディジットが証明するのは、その文字列が計算規則と矛盾していないという一事だけです。

  • 発行されたかどうかは分かりません。
  • 誰に帰属するかも分かりません。
  • 現在も有効かどうかも分かりません。
  • 決済や手続きに使えるかどうかも分かりません。

これらはすべて別の層の話で、登録台帳への照会や本人確認といった手続きが必要になります。検証ツールが「有効」と表示するのは、あくまで公開されている算法に合格したという意味です。この区別を曖昧にしたまま画面の文言を書くと、利用者は「通ったのだから使えるはずだ」と受け取ってしまいます。

反対に、通らなかった場合も「偽物だ」という意味にはなりません。多くは入力の取り違えであり、稀に規則そのものが変わっている場合もあります。

一つの番号が複数の制度に該当することがある

同じ桁数の数字列は、複数の制度の規則を同時に満たすことがあります。桁数が同じで、文字種が同じで、チェックディジットの算法が偶然同じであれば、一つの文字列が二つ以上の制度で「合格」します。

このとき、ツールが勝手に一つの国を選んで断定するのは誤りです。利用者が知りたいのは「この番号はどの制度のものか」ではなく「どの制度の規則に合致するか」だからです。候補を並べて示し、判断は利用者に返すのが誠実な設計です。この問題の背景は各国の公的番号を検証するルールはなぜそろわないのかで詳しく扱っています。

正規化でそろえてから数える

検証の前に必ず挟むのが正規化です。空白、ハイフン、中点、斜線といった区切り記号は表示の都合で入っているだけなので、計算の前に取り除きます。英字を含む番号では大文字と小文字も同じものとして扱い、全角と半角の数字も統一します。

正規化は入力ミスを直す処理ではありません。区切り方を人によって変えても同じ番号として扱うための下ごしらえです。ここを省くと、同じ番号が入力の見た目によって別々に判定され、集計や重複チェックが壊れます。

開発者向け:検証の流れをどう層に分けるか

実装では、検証を一つの関数にまとめず、層ごとに関数を分けておくときれいに収まります。

層 役割 失敗したときの扱い
正規化 区切り記号の除去、大小文字と全半角の統一 失敗しない。必ず通す
文字種 許可されない文字の検出 利用者が自分で直せる
桁数 長さの上下限の確認 利用者が自分で直せる
チェックディジット 末尾の一位の照合 利用者が自分で直せる
制度の判定 該当する候補の列挙 規則がない場合がある

層を分けておくと、どの層で落ちたかをそのままメッセージに反映できます。すべてを一つの真偽値に潰すと、利用者には「間違っています」としか伝えられません。

さらに、結論は四つの状態を区別して返すようにします。チェックディジットが成立した状態、形式は合うがチェックディジットが成立しない状態、算法が非公開で形式しか見られない状態、そして当サイトに対応する規則がない状態です。この四つを一つの「無効」にまとめると、規則を知らないだけの番号を誤って否定することになります。ここで扱わなかった算法の中身はチェックディジットのアルゴリズムで整理しています。

なお、本文中の番号や計算結果はすべて検証の三層構造を説明するために構成した作り物の例であり、実在の個人・企業・口座・刊行物とは対応しません。実際の照会や本人確認の根拠にはできません。

次の一手

まずは手元の番号を一つ用意し、番号検証ツールに貼り付けて、どの層まで通るかを確かめてみてください。形式だけで止まった場合は、その番号に公開された算法が存在しないという意味であり、入力が誤っているという意味ではありません。チェックディジットがそもそも無い種類の番号についてはチェックディジットがない番号で扱っています。あわせて公的番号のチェックディジットの考え方も参考にしてください。

続けて読む

カード番号・公的番号の検証ツールの関連記事