基于Luhn算法的银行卡卡号的格式校验

2023-11-21 04:30

本文主要是介绍基于Luhn算法的银行卡卡号的格式校验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


最近借着儿童节,给大家发了一些比较愉快性的文章,其中包括自己处理制作的,也有网络精选转载的,但都是自己精心准备的,很高兴的是,阅读量也算是相比之下较高的。

这就是[技术鸟]公众号的特点,有干货,也有娱乐,围绕技术开发展开的文章推送,希望大家喜欢,也欢迎多多交流,提出自己的想法,分享是一种快乐!

引言

在金融类软件开发过程中,经常会涉及到用户银行卡信息的校验,包括银行卡卡号、开户人姓名、身份证号和手机号等。理想状况下,当然希望能够将这些信息传递给服务器,然后服务器通过银行或其他机构提供的API进行匹配性的验证。但是,如果服务器没有这些可供验证的API,就只能在APP端进行一个格式上的校验了。

身份证号可以用16位或18位的数字和字母组成的正则表达式验证格式,手机号可以用11位的数字验证,而对于银行卡卡号就相对比较麻烦了,涉及到下面阐述的Luhn算法规则。

Luhn简介

Luhn算法/公式,也称“模10算法”,是一种简单的校验公式,常被用于银行卡卡号、IMEI号等证件号码的识别校验。Luhn算法是由IBM的一位科学家所创,之后被ISO指定,成为大家公认的一项标准。

注意一点,Luhn算法存在的目的并不是成为一种加密安全的哈希函数。它的目的在于防止意外操作导致的错误,如错误输入,而不是恶意攻击。很多银行卡卡号和政府证件号码将该算法作为一种简单的方式用于从键盘错误录入或其他错误号码中分辨有效数字。

校验规则

Luhn算法被用于最后一位为校验码的一串数字的校验,通过如下规则计算校验码的正确性:

  1. 按照从右往左的顺序,从这串数字的右边开始,包含校验码,将偶数位数字乘以2,如果每次乘二操作的结果大于9(如 8 × 2 = 16),然后计算个位和十位数字的和(如 1 + 6 = 7)或者用这个结果减去9(如 16 - 9 = 7);

  2. 第一步操作过后会得到新的一串数字,计算所有数字的和(包含校验码);

  3. 用第二步操作得到的和进行“模10”运算,如果结果位0,表示校验通过,否则失败。

下面,我们通过具体的例子来说明上述规则,给定一串数字:7992739871x,注意,末尾的x表示校验码,按照上面的规则进行计算,如图:


按照规则计算新数字串中各位数字的和:67+x ,并进行“模10”运算:(67+x) mod 10 ,只有满足结果为0的x值才是正确的校验码。通过如下计算可以得到x的值:

  1. 计算不包含校验码的所有数字的和(67);

  2. 乘以9(603);

  3. 最后一位数字,3,就是检验码,即,x = 3 。

当然,你也可以选择别的计算方式,或者口算就能得到x为3,毕竟目的只有一个, 路可以有很多条。诸如其他的值,x为{1,2,4,5,6,7,8,9,0},都是错误的,均不满足Luhn算法的要求。

优缺点

Luhn算法可以检测出任何单码错误和近乎所有的相邻数字交换产生的错误,但是检测不出两个数字序列09和90的交换错误。它可以检测出十分之七比例的相同两位数交换错误(但2 ↔ 55, 33 ↔ 66 和 44 ↔ 77除外)。

Java实现

通过上面算法介绍和规则说明,大家应该能够利用自己所擅长的语言实现对银行卡卡号格式的校验了,比如Java语言下的校验实现代码为:

    /*** 匹配Luhn算法:可用于检测银行卡卡号* @param cardNo* @return*/public static boolean matchLuhn(String cardNo) {int[] cardNoArr = new int[cardNo.length()];for (int i=0; i<cardNo.length(); i++) {cardNoArr[i] = Integer.valueOf(String.valueOf(cardNo.charAt(i)));}for(int i=cardNoArr.length-2;i>=0;i-=2) {cardNoArr[i] <<= 1;cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10;}int sum = 0;for(int i=0;i<cardNoArr.length;i++) {sum += cardNoArr[i];}return sum % 10 == 0;}

利用Luhn算法的规则也可以写出随机生成一个满足条件的银行卡卡号的实现代码。

Luhn算法英文参考:
https://en.wikipedia.org/wiki/Luhn_algorithm#cite_note-0

友情推荐

FRIENDLY

专注程序员的编程知识,原创教程,最新动态等。现在是编程的黄金时代,是程序员的ShowTime。我们不是码农,不是屌丝,也不是程序猿,我们是程序员联盟

微信ID:ProgrammerLeague

热门文章

☞ 儿童节专场|送给程序员的礼物,还有比这更合适的吗

☞ 这一行做久了,码农气息就无处不在了

☞  如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?

☞ 女程序员做了个梦,各路大神惊现神级评论!

☞ 不给你点颜色看看,你是不知道我怎么写代码的


阅读原文 查看【更多精彩】!

这篇关于基于Luhn算法的银行卡卡号的格式校验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/399826

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO