我有以下用于验证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都会检出。
出于显而易见的原因,我不想在此发布,但同时我需要有人来验证它是否有效。
也许我的实施并不正确。
请帮忙。
答案 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)