python银行卡号码校验Luhn模10算法
作者:CC11001100 发布时间:2022-03-18 07:32:52
有时候在网上办理一些业务时有些需要填写银行卡号码,当胡乱填写时会立即报错,但是并没有发现向后端发送请求,那么这个效果是怎么实现的呢。
对于银行卡号有一个校验算法,叫做Luhn算法。
一、银行卡号码的校验规则
银行卡号码的校验采用Luhn算法,校验过程大致如下:
1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….
2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。
3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。
4. 如果s能够整除10,则此号码有效,否则号码无效。
因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。
校验算法比较简单,一个python的实现:
#! /usr/bin/python3
# -*- coding: utf-8 -*-
def luhn(card_num):
s = 0
card_num_length = len(card_num)
for _ in range(1, card_num_length + 1):
t = int(card_num[card_num_length - _])
if _ % 2 == 0:
t *= 2
s += t if t < 10 else t % 10 + t // 10
else:
s += t
return s % 10 == 0
if __name__ == '__main__':
print(luhn('6226095711989751'))
二、生成符合Luhn规则的银行卡号测试数据
前面既然摸清了银行卡号的校验规则,那么就可以根据此规则生成一些能够通过Luhn校验的测试数据。
思路:
因为最右边的一位是奇数位,奇数位不需要改变值直接放啥就是啥,这个特性很重要,正好可以用来补齐到正好能够整除10。
所以显然能够推测出生成n位符合Luhn规则的算法:
1. 随机生成n-1位字符,称为字符串x。
2. 先假设字符串x有n位(实际上最右边一位缺失是n-1位),将x按照n位长度计算和s,因为最右边第一位是缺失的,忽略跳过,所以计算时最右边一位从2开始。
3. 上一步得到字符串x的校验和s,将s加上一个数字y,使得它正好可以整除10,这个y就是最右边第一位应该放的数字。
4. x+y做字符串拼接运算,得到最终的n位符合Luhn规则的字符串。
实现代码:
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import random
def gen_card_num(start_with, total_num):
result = start_with
# 随机生成前N-1位
while len(result) < total_num - 1:
result += str(random.randint(0, 9))
# 计算前N-1位的校验和
s = 0
card_num_length = len(result)
for _ in range(2, card_num_length + 2):
t = int(result[card_num_length - _ + 1])
if _ % 2 == 0:
t *= 2
s += t if t < 10 else t % 10 + t // 10
else:
s += t
# 最后一位当做是校验位,用来补齐到能够整除10
t = 10 - s % 10
result += str(0 if t == 10 else t)
return result
def luhn(card_num):
s = 0
card_num_length = len(card_num)
for _ in range(1, card_num_length + 1):
t = int(card_num[card_num_length - _])
if _ % 2 == 0:
t *= 2
s += t if t < 10 else t % 10 + t // 10
else:
s += t
return s % 10 == 0
if __name__ == '__main__':
for _ in range(1000):
random_card_num = gen_card_num('622609', 16)
valid_result = luhn(random_card_num)
print('%s %s' % (random_card_num, valid_result))
三、小结
1. 在开发需要填写银行卡号的表单时,最好能够在前端加上一层Luhn校验,以将大部分的非法输入在前端就拦截过滤掉。
2. 在需要一些银行卡号测试数据时,可以使用上面的代码生成一些合法的银行卡号作为测试数据。
3. 明白了这些之后以后转账再输卡号不用那么担心了,因为如果不小心输错了一位的话能够校验出来的,当然理论上是这样的,但对于我这样的穷人十块钱以上的高额交易就得确认好几次…
相关资料
在线查询银行卡号归属信息工具 - aTool在线工具
银行卡校验规则(Luhn算法)
来源:https://www.cnblogs.com/cc11001100/p/9357177.html
猜你喜欢
- 本文实例讲述了Python装饰器基础概念与用法。分享给大家供大家参考,具体如下:装饰器基础前面快速介绍了装饰器的语法,在这里,我们将深入装饰
- 今天萌发一个想法,用css来实现透视效果。起初,我想到的是我们常见的添加阴影效果的方法,用多个div通过偏移来实现,但这需要很多 div,不
- 今天偶尔在一个学习网站技术的地方看到一个教程,关于html代码的,刚看到咱常用到的视频播放器html标签Object,平时用到他的时候都是为
- 下面这个函数使用FSO对象来判断服务器上的某个文件是否存在:<%Private Function Dir(byVa
- 字体设计是人类商业活动的需求,它随着时代和科学技术的进步而不断地变化着。被广泛应用于网络生活的各个方面。现代字体设计在计算机技术的应用中已经
- 第一种是用urllib模块,下面是例示代码:import urllibstatus=urllib.urlopen("https:/
- 目前是把图片存在mongodb数据库,实现一个方法,比如 访问 /get_pic/ID 能实现图片在浏览器打开,添加了一个状态,比如?fil
- 假设我们需要从各种网页中提取全文,并且要剥离所有HTML标记。通常,默认解决方案是使用BeautifulSoup软件包中的get_text方
- Python由于语言的简洁性,让我们以人类思考的方式来写代码,新手更容易上手,老鸟更爱不释手。要写出 Pythonic(优雅的、地道的、整洁
- 关于本文:本着互联网共享主义精神,特写此文献给建站新手,授人以鱼,不如授人以渔,本文所讲的只是方法和原理,希望大家看完此文,能够从中得到些帮
- NMS 算法在目标检测,目标定位领域有较广泛的应用。算法原理非极大值抑制算法(Non-maximum suppression, NMS)的本
- 这年头,信息和获得信息的渠道越来越多。随着信息量的增大,先有了分类,又有了导航,再有了搜索,后面的发展还不得而知。在此只是根据平日的所看所想
- 首先,建立一个Conn的连接对象,然后连接到数据库data.mdb中,取得连接句柄后,把它保存在session("conn&quo
- 每次写完的东西就忘了,下次用时还要重查资料重新写,这是今天写的一段测试代码,保留下来,记录给自已,同时分享给大家。目标:把下边的这个上传文件
- 本文实例展示了Python使用函数默认值实现函数静态变量的方法,具体方法如下:一、Python函数默认值Python函数默认值的使用可以在函
- 假设我们有一个非常简单的Post模型,它将是一个图像及其描述,from django.db import modelsclass Post(
- 本文总结了ASP初学者常犯的几个错误,希望对asp学习者有所帮助!1.记录集关闭之前再次打开:-----------------------
- 本文实例讲述了PHP面向对象程序设计继承用法。分享给大家供大家参考,具体如下:<?php//继承是子类(派生类)从父类(基类,超类)继
- 一. 访问WEB数据库的多种方案目前在WINDOWS环境下有多种访问WEB数据库的技术,主要有:1.公共网关接口CGI(Commo
- 修改字符串本身是不可能的,因为字符串是不可变类型,只能是通过某些方法来产生它的副本。再把副本赋值给原字符串,达到类似替换的作用。这里介绍几种