マイナンバーのチェックディジットを確認する必要があったのでPHP関数を作りました。
マイナンバー(個人番号)のチェックディジットの計算式は法律に記載されています。
(検査用数字を算出する算式)第五条 令第八条の総務省令で定める算式は、次に掲げる算式とする。
算式
11―(n=1(シグマ)11(Pn×Qn))を11で除した余り)
ただし、(n=1(シグマ)11(Pn×Qn))を11で除した余り≦1の場合は、0とする。
算式の符号
Pn 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を1桁目としたときのn桁目の数字
Qn 1≦n≦6のとき n+1 7≦n≦11のとき n―5
これを使って入力されたマイナンバーが妥当であるか確認できます。形式として正しいことだけチェックするのでマイナンバーが本人の物であるか、などは当然確認できません。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php // 個人用マイナンバーを計算。(注:法人用は異る) // アルゴリズムは // http://law.e-gov.go.jp/announce/H26F11001000085.html // を参照。 function verifyPersonalMyNumber($mynum) { // 必ず12文字 if (strlen($mynum) !== 12) { return FALSE; } $sum = 0; // 最後の一文字がチェックディジット。小さい桁から計算。 for ($i=1; $i <= 11; $i++) { $m = substr($mynum, 11-$i, 1); $n = ($i <= 6) ? $i+1 : $i-5; $sum += $m * $n; } $mod = $sum % 11; // 必ず数字一桁 if ($mod <= 1) { return FALSE; } else { return ((int)substr($mynum, 11, 1) === 11 - $mod); } } // テスト (注:0で始まる場合も考慮すると文字列でなければならない) $mynum = '123456789010'; for ($i = 0; $i < 10; $i++) { var_dump($mynum+$i, verifyPersonalMyNumber($mynum+$i)); } |
出力
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [yohgaki@dev ~]$ php mynumber.php int(123456789010) bool(false) int(123456789011) bool(false) int(123456789012) bool(false) int(123456789013) bool(false) int(123456789014) bool(false) int(123456789015) bool(false) int(123456789016) bool(false) int(123456789017) bool(false) int(123456789018) bool(true) int(123456789019) bool(false) |
問題ないと思いますが、さっと作ったので問題があれば教えてください。