Luhn算法计算校验位方法

一,背景

Luhn算法,也被称为“模10”或“Mod 10”算法,常用于信用卡号、条形码序列号、国家供应商标识符(NPI)等场景中生成校验位,以验证号码的正确性。下面用Java语言来实现一个简单的Luhn算法,用于生成校验位。

二,算法

我们以数字“7992739871”为例,计算其校验位:

1,从校验位开始,从右往左,偶数位乘2(例如,1*2=2),然后将两位数字的个位与十位相加(例如,16:1+6=7,18:1+8=9);

2,把得到的数字加在一起(本例中得到67);

3,将数字的和取模10(本例中得到7),再用10去减(本例中得到3),得到校验位。

注:这里的期望值是我已经计算过

原始数字

7

9

9

2

7

3

9

8

7

1

期望为3

偶数位乘2

7

18

9

4

7

6

9

16

7

2

x

将数字相加

7

9

9

4

7

6

9

7

7

2

x

另一种方法是:

1,从校验位开始,从右往左,偶数位乘2,然后将两位数字的个位与十位相加;

2,计算所有数字的和(67);

3,乘以9(603);

4,取其个位数字(3),得到校验位。

三,实现

public class Demo {
    public static void main(String[] args) {
        System.out.println("期望:3, 实际: " + generateCheckDigit("7992739871"));
        //手机IMEI的例子
        System.out.println("期望:9, 实际: " + generateCheckDigit("35819914234508"));
        System.out.println("期望:4, 实际: " + generateCheckDigit("35819914245806"));
        //前面补零不影响结果的例子
        System.out.println("期望:5, 实际: " + generateCheckDigit("012"));
        //信用卡号的例子
        System.out.println("期望:9, 实际: " + generateCheckDigit("434559113895531"));
    }

    public static int generateCheckDigit(String number) {
        int sum = 0;
        boolean isSecond = true;

        // 从右边第二个字符到左遍历字符串中的每个字符
        for (int i = number.length() - 1; i >= 0; i--) {
            // 将字符转换为整数
            int n = number.charAt(i) - '0';
            if (isSecond == true) {
                n *= 2;
                // 如果结果大于9,则减去9
                if (n > 9) {
                    n -= 9;
                }
            }
            // 累加总和
            sum += n;
            // 切换标志
            isSecond = !isSecond;
        }
        // 计算校验位
        sum *= 9;
        int checkDigit = sum % 10;

        return checkDigit;
    }

}

四,说明

1,Luhn算法的目的只是防止意外出错而不是恶意攻击,它不是安全的。

2,在原数字前补任何个零都不影响结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东皋长歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值