home

1.是什么

Luhn算法(Luhn algorithm),也称为“模10”(Mod 10)算法,是一种简单的校验和算法,一般用于验证身份识别码,例如发卡行识别码、国际移动设备辨识码(IMEI),美国国家提供商标识号码,或是加拿大社会保险号码。该算法由IBM科学家Hans Peter Luhn创造,专利于1954年1月6日申请,1960年8月23日颁证,美国专利号2950048。 引用自百度百科

2.计算规则

  1. 从校验位开始,从右往左,偶数位乘2(例如,1*2=2),然后将两位数字的个位与十位相加(例如,16:1+6=7,18:1+8=9);
  2. 把得到的数字加在一起(本例中得到67);
  3. 将数字的和取模10(本例中得到7),再用10去减(本例中得到3),得到校验位。

3.应用场景--各类卡号的生成

银行卡结构

XXXXXX XXXXXXXXXXXX X 发卡行标识代码 自定义位 校验码 根据类型分为借记卡和信用卡,16位居多 参考知乎问答

实际用途--生成测试银行卡号

1.银行卡前缀

由各发卡号行指定

2.银行卡自定义位

由各发卡号指定

3.银行卡校验位

通过模10规则获得

java实现

    public static String generateByPrefix(Integer prefix) {
        Random random = new Random(System.currentTimeMillis());
        String bardNo = prefix + StringUtils.leftPad(random.nextInt(999999999) + "", 9, "0");
        char[] chs = bardNo.trim().toCharArray();
        int luhnSum = LuhnUtils.getLuhnSum(chs);
        char checkCode = luhnSum % 10 == 0 ? 48 : (char)(10 - luhnSum % 10 + 48);
        return bardNo + checkCode;
    }



    public static int getLuhnSum(char[] chs) {
        int luhnSum = 0;
        int i = chs.length - 1;

        for(int j = 0; i >= 0; ++j) {
            int k = chs[i] - 48;
            if (j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }

            luhnSum += k;
            --i;
        }

        return luhnSum;
    }