IMEI没有通过Luhn Checksum

时间:2017-09-09 14:50:06

标签: java checksum imei luhn

我有以下用于验证IMEI(不是SV)的代码

public static boolean luhnc(char[] digits) {
    int sum = 0, s = 0;
    for (int i = 0; i < digits.length - 1; i += 2) {
        s = (digits[i+1] - '0') * 2;
        sum += (s > 10 ? s - 9 : s) + (digits[i] - '0');
    }
    return 10 - (sum % 10) == (digits[digits.length-1] - '0');
}

除了我的三星Galaxy Note 4外,几乎每个IMEI都会检出。

出于显而易见的原因,我不想在此发布,但同时我需要有人来验证它是否有效。

也许我的实施并不正确。

请帮忙。

2 个答案:

答案 0 :(得分:1)

执行Luhn algo操作后,您*2错过了一个点,它是

  • 如果数字为>=10(而非>),则10变为0而不是1

所以这样修复(我在新行中提取它以便为你清楚):

for (int i = 0; i < digits.length - 1; i += 2) {
    s = (digits[i + 1] - '0') * 2;                 
    sum += (s >= 10 ? s - 9 : s) + (digits[i] - '0');
}

另外,我建议您使用int[]代替char[]删除- '0'无处不在

答案 1 :(得分:1)

另一种替代方法是使用Apache Commons中的库。

org.apache.commons.validator.routines.checkdigit.LuhnCheckDigit.LUHN_CHECK_DIGIT.isValid(imei)