Edited at

マイナンバーのチェックデジットを計算する

More than 3 years have passed since last update.


そもそもマイナンバーってどういう数字なのでしょうか?

これは法律を読みます。調べると「行政手続における特定の個人を識別するための番号の利用等に関する法律施行令」の第八条に書いてあります。


十一桁の番号及びその後に付された一桁の検査用数字により構成されるものとする。


つまり11桁+検査用数字1桁で12桁なんですね。さらに条件があって、


  1. 住民票コードを変換して得られる

  2. マイナンバーから住民票コードを復元できない

  3. 変更されて過去に使っていたものも含めてかぶらない

ということになっています。


検査用数字とは?

いわゆるチェックデジットですが、計算方法が「総務省令第八十五号」(PDF)の第5条に定義があります。まとめると



  • 検査用数字 : $11 - \Bigl( \displaystyle\sum_{n=1}^{11} P_n \times Q_n \Bigr) \% 11$


    • ただし $\Bigl( \displaystyle\sum_{n=1}^{11} P_n \times Q_n \Bigr) \% 11 ≦1 $の場合は、$0$とする




  • $Pn$と$Qn$の定義


    • $Pn$ : 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を $1$ 桁目としたときの $n$ 桁目の数字

    • $Qn$ : $1≦n≦6$ のとき $n+1$、 $7≦n≦11$ のとき $n-5$




というわけでさっそく計算しましょう


mynumber_validate.rb

def validate_my_number(mynumber)

# 整数列化
digits = mynumber.to_s.chars.map(&:to_i)
# 12桁しか認めない
return false unless digits.length == 12
# チェックデジットを分離します
check_digit = digits.pop

# 残った数字を小さい方から調べます
digits.reverse!

# 数列の和を11で割った余りを計算します
remainder = (1..11).inject(0) {|sum, i|
p = digits[i-1]
q = (i <= 6) ? i+1 : i-5
sum + p*q
} % 11

case remainder
when 0,1
check_digit === 0
else
check_digit === (11 - remainder)
end
end

p validate_my_number(123456789010) #=> false
p validate_my_number(123456789011) #=> false
p validate_my_number(123456789012) #=> false
p validate_my_number(123456789013) #=> false
p validate_my_number(123456789014) #=> false
p validate_my_number(123456789015) #=> false
p validate_my_number(123456789016) #=> false
p validate_my_number(123456789017) #=> false
p validate_my_number(123456789018) #=> true
p validate_my_number(123456789019) #=> false
p validate_my_number("023456789013") #=> true (先頭が0の場合)


先頭の11桁が12345678901の場合、検査用数字は8になるので123456789018が有効な番号となり、それ以外は全て不正なナンバーとなります。マイナンバーが届いたら合っているか計算してみましょう。


まとめ

マイナンバーの形式と、検査用数字(チェックデジット)の計算方法を書きました。もう少しキレイに書けるかもしれませんね。免許証なんかもほぼ同じ理屈です。個人情報ですので取り扱いには十分ご注意ください。