经过查看ISO/IEC 7812-1:2017
文件能够看到对于luhn算法的解释,以下图:git
算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2; 第二步:把第一步所得的每个数字加入到原来的数中,
好比9*2=18,为1+8
; 第三步:用以0结尾且大于第二步所得到的数的和的最小整数减去第二步所得到的和便可以得到校验位,如70-67=3,3即为校验位
,若是第二步全部数字的和以0
结尾,好比30、40、50等
,那么校验为0;算法
TS.06 IMEI Allocation and Approval Process
中规定IMEI校验应该经过Luhn算法
计算,以下图所示: public class LuhnCalcCheckDigit { /// <summary> /// 经过Luhn算法计算校验位,适合IMEI、银行卡等 /// </summary> /// <param name="imei">不包含校验位的号码</param> /// <returns></returns> public static int CalcLuhnCheckDigit(string imei) { int checkDigit = 0; int addValue = 0; for (int i = 0; i < imei.Length; i++) { if (i % 2 == 0) { int result = Convert.ToInt32(imei[imei.Length - i - 1].ToString()) * 2; if (result > 9) { addValue += (result - 9); } else { addValue += result; } } else { addValue += Convert.ToInt32(imei[imei.Length - i - 1].ToString()); } } if (addValue % 10 == 0) { checkDigit = 0; } else { checkDigit = 10 - addValue % 10; } return checkDigit; } /// <summary> /// 经过Luhn算法核验号码是否合法,适合IMEI、银行卡等 /// </summary> /// <param name="imei">包含校验位的号码</param> /// <returns></returns> public static bool VerifyLuhn(string imei) { int checkDigit = 0; int addValue = 0; for (int i = 1; i < imei.Length; i++) { if (i % 2 == 1) { int result = Convert.ToInt32(imei[imei.Length - i - 1].ToString()) * 2; if (result > 9) { addValue += (result - 9); } else { addValue += result; } } else { addValue += Convert.ToInt32(imei[imei.Length - i - 1].ToString()); } } if (addValue % 10 == 0) { checkDigit = 0; } else { checkDigit = 10 - addValue % 10; } return (checkDigit - Convert.ToInt32(imei[imei.Length - 1].ToString())) == 0; } }
TS.06 IMEI Allocation and Approval Process ISO/IEC 7812-1:2017app