信用卡号码通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数、偶数位(用红色标出)分布:5432123456788881
奇数位和=35
偶数位乘以2(有些要减去9)的结果:16 2 6 1 5 7 7,求和=35。
最后35+35=70可以被10整除,认定校验通过。
方法如下:
public static boolean isLuhn(String number) { int sumOdd = 0; int sumEven = 0; int length = number.length(); int[] wei = new int[length]; for (int i = 0; i < number.length(); i++) { wei[i] = Integer.parseInt(number.substring(length - i - 1, length - i)); } for (int i = 0; i < length; i++) { if (i % 2 == 0) { sumOdd += wei[i]; } else { if ((wei[i] * 2) > 9) { sumEven += wei[i] * 2 - 9; } else { sumEven += wei[i] * 2; } } } return (sumOdd + sumEven) % 10 == 0; }
调用方式:
for (int i = 0; i <= 9; i++) { String randomId = ”2398123“ + i; if (isLuhn(randomId)) { System.out.println(randomId); } }
扩展知识:
我们知道,公民的身份证是18 位,而最后一位就是校验位。喜欢玩游戏的小伙伴一定都有这样的经历,游戏需要实名认证,而有时候也不想泄露自己的身份证信息。有时候就会随便输入一个身份证,系统就能马上判断出你的身份证是无效的。怎么做到的呢?
把前 17 位分别乘上以下系数,然后相加:
然后把相加的结果模除 11,得到的余数只可能是0-10。余数再按照下表做一次变换,就可以得到最后一位:
当余数是2时,经过上面变换后就是X,这也说明了为什么有些人的身份证最后一位是 X。
实现方法:
public class demo { public static void main(String[] args) { isLuhn("身份证前17位"); } public static boolean isLuhn(String number) { int sumEven = 0; int sumOdd = 0; int length = number.length(); int sumTemp = 0; char[] charArray = number.toCharArray(); int[] intXiShu = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; char[] charEnd = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; for (int i = 0; i < number.length(); i++) { int num = Integer.parseInt(String.valueOf(charArray[i])); sumTemp += num * intXiShu[i]; } int mod = sumTemp % 11; System.out.println(charEnd[mod]); return false; } }
参考:
https://blog.csdn.net/ganglia/article/details/7059675
https://www.freebuf.com/articles/others-articles/136742.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现