經過查看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算法
計算,以下圖所示: 三、C#代碼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