基于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

相关文章

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.