メニュー

各国の公的番号を検証するルールはなぜそろわないのか

各国の公的番号を検証するとき、公開されている情報の量が国ごとに違うために何が起きるのか、候補を並べる設計と規則をデータとして持つ考え方を整理します。

公開日

  • 公的番号
  • 各国対応

各国の公的番号を検証するルールは、世界共通の一つの表にまとめることができません。公開されている情報の量が国ごとに違い、同じ種類の番号でも扱いが変わるからです。この記事では、その差がどこから来るのかを三つの類型に分け、国際的な利用者を抱えるシステムで何を設計すべきかを整理します。

各国の公的番号を一つの規則で検証できないのはなぜか?

理由は、公表されている情報の量がそろっていないことに尽きます。大きく三つの類型があります。

類型 公表されている内容 できること
算法まで公表 桁の構成と検証用の位の計算方法 末尾の位まで計算で確かめられる
形式のみ公表 桁数と使われる文字の種類 形式の一致だけを確かめられる
説明が不完全 断片的な説明のみ 限定的な確認にとどまる

一番上の類型でも、確かめられるのは自己整合性までです。真ん中の類型では、計算で確かめる手段がありません。一番下の類型では、そもそも何を確かめているのかを説明しにくくなります。三つを同じ「検証」という一語で呼ぶと、利用者は同じ強さの保証を受け取ったと誤解します。

算法まで公表している制度の扱い

算法が公表されている場合、末尾の位を計算し、実際の値と比べることができます。ここで得られる結論は「つじつまが合う」か「合わない」かの二つです。

注意したいのは、つじつまが合うことが、その番号が発行されたことを意味しないという点です。計算は文字列の内部の関係を見ているだけであり、台帳の状態には触れていません。この境界を越えて説明すると、検証の意味が変わってしまいます。

また、算法が公表されていても、桁の構成の一部が運用で変わることがあります。公表されている説明がいつの時点のものかを意識しておくと、判定のずれを説明しやすくなります。

形式だけが公表されている制度の扱い

形式だけが分かる場合、確かめられるのは桁数と文字種です。これだけでも、明らかな入力ミスを相当程度はねられます。桁が一つ足りない、想定外の記号が混ざっている、といった誤りはこの段階で見つかります。

ただし、この段階で得られる結論を「有効」と呼ぶことはできません。算法がない以上、有効性の判断は原理的にできません。ここで正直に「形式のみ」と表示することが、最も誤解の少ない答えになります。この点はチェックディジットがない番号で詳しく扱っています。

形式の照合は、次の段階への分流としても役に立ちます。形式が合ったものを登録照会へ回し、合わなかったものを入力の見直しへ回す、という流れが作れるからです。

一つの番号が複数の国に当てはまるときはどうするのか?

桁数と文字種が同じで、たまたま検証用の位の算法も同じである場合、一つの文字列が複数の国の規則を満たすことがあります。珍しい偶然ではありません。桁数が五から十程度の範囲には、世界中の制度が集中しているからです。

このときにやってはいけないのは、ツールが一つの国を選んで断定することです。番号の見た目から国を推測する仕組みは、例外を見つけるたびに壊れていきます。正しい振る舞いは、該当した制度をすべて並べて示し、どの制度として扱うかを利用者に決めてもらうことです。

候補が複数ある状態は、失敗ではなく情報です。その番号だけでは一意に決まらないという事実こそが、利用者の次の判断に必要な材料になります。

桁数と文字種は出発点にすぎない

形式の確認を「検証の完了」と取り違えるのは、この分野で最も多い誤りです。桁数が合っていることは、番号が存在することの証拠にはなりません。

この取り違えが起こるのは、形式の確認が簡単で速いからです。実装も容易で、テストも書きやすい。そのため、形式の確認だけを実装して検証を終えたつもりになりがちです。しかし利用者から見れば、形式が合ったという結果は「この番号は正しい」という意味に読めます。措置としては、画面の文言で形式と算法を明確に分けることが最小限必要です。

開発者向け:国の規則をデータとして扱う

国際的な利用者を抱えるシステムでは、各国の規則を業務のロジックに埋め込まないことが重要です。規則は差し替え可能なデータとして持ち、ロジックは規則を引いて適用するだけにします。

この設計にすると、次の利点があります。

  • ある国の桁数が変わっても、データを一つ直すだけで済みます。
  • 新しい国を追加するときに、既存の判定に触れずに済みます。
  • 過去の判定がどの規則に基づいたかを、あとから説明できます。

規則のデータには、国や制度の識別子、対象の種別、形式の条件、算法の有無を持たせます。算法がある場合だけ計算を呼び出し、ない場合は形式の結果だけを返します。そして、どの規則を適用したかを結果に添えて返します。根拠を示せない検証結果は、利用者にとって修正の手がかりになりません。

なお、ここで述べたのは各国の制度の一般的な性質であり、特定の国の桁数や割り当てを示すものではありません。例として用いた説明はすべて構成上のもので、実在の番号に対応しません。

次の一手

自分のシステムが対応している国の一覧を見て、それぞれが三つの類型のどれに当たるかを書き出してみてください。算法がない国を「対応済み」として扱っている箇所があれば、表示の文言を見直す余地があります。番号検証ツールで実際の表示を確かめ、CPF と CNPJ の検証のような具体例と見比べると、類型の違いがつかみやすくなります。あわせて公的番号のチェックディジットの考え方も参考にしてください。

続けて読む

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