Help us understand the problem. What is going on with this article?

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

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が有効な番号となり、それ以外は全て不正なナンバーとなります。マイナンバーが届いたら合っているか計算してみましょう。

まとめ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした