Python实现Luhn模10算法进行银行卡号校验与生成
本文详解Luhn模10算法原理,介绍其在前端表单校验中的应用以拦截非法输入。同时提供Python代码实现,演示如何根据校验规则生成符合规范的银行卡号测试数据,帮助开发者优化表单体验并简化测试流程。
在部分在线业务办理场景中,用户输入银行卡号后若格式错误会立即收到报错提示,且该过程并未向后端服务器发送请求。这种即时反馈机制通常由前端脚本实现。
实现这一功能的核心在于采用Luhn算法对银行卡号进行有效性验证。
一、银行卡号码的校验规则
银行卡号的有效性验证基于Luhn算法,具体执行流程如下:
1. 对卡号字符串从右至左进行编号,最右侧第一位记为1,第二位记为2,第三位记为3,依此类推。
2. 从右向左遍历每一位数字t,执行后续计算步骤,并将所有位数的计算结果累加得到总和s。
3. 具体计算规则为:若当前位为奇数位,则保留原值t;若为偶数位,则将t乘以2得到n。若n小于10(即为一位数),直接取n;若n大于等于10,则取n的个位数与十位数之和。
4. 若总和s能被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位),按n位长度规则计算校验和s。注意:因最右侧位缺失,计算时从右数第二位开始(即编号从2开始)。
3. 获取上一步计算的校验和s,寻找一个数字y,使得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. 当需要生成银行卡号测试数据时,可利用上述代码批量生成符合Luhn校验规则的合法卡号,用于系统测试。
3. 理解该原理后,日常转账输入卡号时若有误,前端校验可帮助及时发现错误。当然,对于大额交易,仍需人工仔细核对以确保准确。
相关资料
在线查询银行卡号归属信息工具 - aTool在线工具
银行卡校验规则(Luhn算法)
以上就是Python银行卡号码校验Luhn模10算法的详细内容,更多关于银行卡号码校验Luhn算法的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









