乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

チェックデジット

さて
今回は免許証番号のチェックデジットについての
お話になります。

動画はこちら




免許証番号にも法則性があり
必ず一定のルールに従った番号体系になっています。

もしそのルールに番号に沿っていなかったら
そこで偽造だとわかる事になります。

 まず最初に免許証番号のルールですが
こんな感じだそうです。

免許証番号は、県警察電算処理システムの電子計算機で管理し
新規免許登録時に付与されるが、 公安委員会コード
年号記号、交付番号及び再交付記号並びに
チェックデジットをもって構成する(12桁の数)。

例 309212345610

最初の2桁は公安委員会コード
続く2桁は発行年号(下2桁)
続く6桁が交付番号(発行番号)
その次1桁がチェックデジット
最後の1桁は再発行回数

menban


公安委員会コードは定められていて
こんな感じです。
北海道 北海道
10
函館
11
旭川
12
釧路
13
北見
14
           
東北 青森
20
岩手
21
宮城
22
秋田
23
山形
24
福島
25
         
関東甲信越 東京
30
茨城
40
栃木
41
群馬
42
埼玉
43
千葉
44
神奈川
45
新潟
46
山梨
47
長野
48
静岡
49
北陸・中部 富山
50
石川
51
福井
52
岐阜
53
愛知
54
三重
55
         
関西 滋賀
60
京都
61
大阪
62
兵庫
63
奈良
64
和歌山
65
         
中国 鳥取
70
島根
71
岡山
72
広島
73
山口
74
           
四国 徳島
80
香川
81
愛媛
82
高知
83
             
九州・沖縄 福岡
90
佐賀
91
長崎
92
熊本
93
大分
94
宮崎
95
鹿児島
96
沖縄
97
     
東京で取得したならば
30ということになります。

続く年号記号(3桁目と4桁目の数字)は
初めて免許を取得した年の西暦下2桁
になります。

例:
2019年に取得 → 19
1992年に取得 → 92

ということで
あまりにもかけ離れていた場合
(今25歳なのに99になっているとか)
その番号が偽りの番号であると
すぐにわかる仕組みです。

続く6桁は発行番号で
一意になるような番号体系です。


最後の12桁目は再交付記号

再交付記号「0」は、再発行がされた事がないのを示し

この数字は紛失・盗難などで再発行する度に増えていき

10回再発行された場合には「1」と記載される仕組みです

なのでほとんどの人は
再発行していないと思うので
「0」になっているのではないかと思います。


そして
11桁目がチェックデジットです。

免許証のチェックデジットの計算方法は
次のとおりになります。


左から10個の数字にそれぞれ、5,4,3,2,7,6,5,4,3,2をかけて合計する

例:「309212345690」のうちの「3092123456」

5×3+4×0+3×9+2×2+7×1+6×2+5×3+4×4+3×5+2×6=123

次に、これを11で割って余りを出す 123÷11=11 余り 2

さらに、11から余りを引く 11-2=9


計算式 :
上位10桁をabcdefghijとすると

(11 - (5a+4b+3c+2d+7e+6f+5g+4h+3i+2j) mod 11) mod 10

チェックデジットを計算する関数は次のようになります。

def check_menkyo_degit(t):
    a = 5*int(t[0])
    b = 4*int(t[1])
    c = 3*int(t[2])
    d = 2*int(t[3])
    e = 7*int(t[4])
    f = 6*int(t[5])
    g = 5*int(t[6])
    h = 4*int(t[7])
    i = 3*int(t[8])
    j = 2*int(t[9])
    degit  = a+b+c+d+e+f+g+h+i+j
    return (11 - degit%11)%10

check_menkyo_degit('309212345690')
9

免許証番号を引数に入れると
チェックデジットが出ます。


これを使って
免許証番号を生成してみましょう。

東京で1999年に取得
交付番号はランダム
再発行は無し
とすると

def make_menkyo(st=30,year=1999):
    t = str(st) + str(year)[2:4]
    t += '{0:06}'.format(random.randint(1,10000))
    cd = check_menkyo_degit(t)
    return t + str(cd) + '0'

make_menkyo()

309900219680

このような形で作ることができます。


このようにチェックデジットは
偽造の防止などに役立てられているので

この番号体系に合わないものは
すぐに弾ける仕組みとなっています。

ましWEBサービスを運営しているのであれば
こういった番号のチェックを行うことで
不正防止をすることができます。

皆様も
お手元に免許証があれば
ぜひ番号チェックをしてみてください

今回はこれまでです
それでは。







さて今回は
「チェックデジット」
というものについてのお話です。




動画はこちら

 



チェックデジットは
データの正確性を保つ為に使用される文字のことで
様々な分野のID番号などの使用されています。

工業用のコード
クレジットカード
免許証

いろんなチェックデジットが存在し
計算方法が違っています。

今回はクレジットカードの
チェックデジットを計算してみましょう。

クレジットカードの番号には法則があり
最初の6桁はカードの発行元
7-15桁目はカード番号
最後の1桁がチェックデジット
となっています。

また
日本で流通しているカード体系で
最初の1桁は金融機関などの業種を表します。

例えば
Visa 4xxxxx
Mastercard51xxxx - 55xxxx
Amex 34xxxx, 37xxxx
などです。

なので最初の6桁と
最後の1桁は必ず法則に従わないと
そのクレジットカード番号は
正しくない番号となります。

それでは
チェックデジットを計算してみましょう。

クレジットカードのチェックデジットの計算方法

元の番号 : 4417123456789113

奇数桁目を2倍に掛ける
8 2 2 6 10 14 18 2

偶数桁目はそのまま足す
4 7 2 4 6 8 1 3

2桁の数は十の位と1の位を足して1桁にする
(2桁の数になったら9を引けばいい)

8+4+2+7+2+2+6+4+1+0+
6+1+4+8+1+8+1+2+3 = 70

和が10で割れる数なら、そのクレジットカードは有効

こんなルールでカード番号が作られています。

お手元に
クレジットカードがある方は
実際に計算してみてはいかがでしょうか?


それでは
このクレジットカードが正しいのかどうかを
計算するプログラムを作っていきたいと思います。

これは至極簡単で数行で済みます。

カード番号をチェックする関数はコレ。
def check_digit(num):
    tmp1 = [int(num[i])*2 for i in range(len(num)) if i%2==0]
    tmp1 = [i-9 if i>9 else i for i in tmp1]
    tmp2 = [int(num[i]) for i in range(len(num)) if i%2==1]
    total = sum(tmp1+tmp2)
    return total%10==0

これを使ってカード番号をチェックしてみましょう。

例題の番号をそのまま使い
check_digit('4417123456789113')
True

カード番号が合っていればTrue
違っていればFalseになります。



それではこの関数を使って
クレジットカード番号を生成してみましょう。

クレジットカード番号を生成する関数はコレ。

import random
def make_card(head = '498003'):    
    num = str(head) + ''.join([str(random.choice([i for i in range(10)])) for i in range(9)])
    for i in range(10):
        if check_digit(num + str(i)):
            return num + str(i)
    return None

実際に使う場合は
make_card(head = '498003')
4980030390770041

このようになります。

最初の6桁は発行元の番号体系に
合わせる必要があります。

引数headの6桁の番号を変更していただければ
その番号で始まるカード番号になります。



さて
チェックデジットはいかがでしたでしょうか?

このように
カード番号などは
チェック機能があるので
デタラメな番号は弾かれるようになっています。

ECサイトなども同様で
正しい番号体系を入れなければ
成立しないようにチェックが働いています。

皆様も
サイト構築をしたりする際は
チェックデジットの仕組みを導入すると
不正防止に繋がりますので
いろいろ考えてみてくださいね

今回はここまでです
それでは。


このページのトップヘ