atq

导航

统计
 

信用卡号码通过Luhn算法来验证通过。

该校验的过程:

1、从卡号最后一位数字开始,逆向将奇数位(135等等)相加。

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 位分别乘上以下系数,然后相加:

校验系数.png

然后把相加的结果模除 11,得到的余数只可能是0-10。余数再按照下表做一次变换,就可以得到最后一位:

校验结果.png

当余数是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

posted on   atq  阅读(443)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
 
点击右上角即可分享
微信分享提示