LoginSignup
8
8

More than 5 years have passed since last update.

Python マイナンバー検証用モジュールを公開

Last updated at Posted at 2015-10-27

pip install可能なPythonでマイナンバーを検証するモジュールです。ruby版と1万件のクロスチェックを行っています。マイナンバーのチェックデジットを計算するの記事が素晴らしかったので参考にしてPython版を作ることが出来ました。

install

install
pip install mynumber

sample code

install
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from mynumber import MyNumber

# マイナンバー検証
my_number = 123456789018
print MyNumber.validate(my_number)

# もっとマイナンバー検証
for my_number in MyNumber.gets(1000):
    assert MyNumber.validate(my_number)

# もっともっとマイナンバー検証 by iterator:重複あり
for my_number in MyNumber():
    assert MyNumber.validate(my_number)

根拠となる法令

○総務省令第八十五号

第五条令第八条の総務省令で定める算式は、次に掲げる算式とする。

算式

$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$ : 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を $1$ 桁目としたときの $n$ 桁目の数字
$Qn$ : $1≦n≦6$ のとき $n+1$、 $7≦n≦11$ のとき $n-5$

原文マイナンバーのチェックデジットを計算するの記事の数式を引用させて頂きました。

他言語版のご紹介

Ruby版で検証

マイナンバーのチェックデジットを計算するの記事のコードでクロスチェックしてみました。

ruby_mynumber_validate.rb
#!/usr/bin/env ruby
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

my_numbers = [
    xxxxx,
    xxxxx,
    xxxxx,
    xxxxx,
]

my_numbers.each do |num|
  r = validate_my_number(num)
  if r == false then
    p num
  end
end




8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8