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




動画はこちら

 



チェックデジットは
データの正確性を保つ為に使用される文字のことで
様々な分野の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サイトなども同様で
正しい番号体系を入れなければ
成立しないようにチェックが働いています。

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

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