Python实现Luhn模10算法进行银行卡号校验与生成

宋时安
宋时安
发布时间:2026-10-15 | 4人浏览过
原创

本文详解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算法的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表