[技術棧]C#利用Luhn算法(模10算法)對IMEI校驗

一、Luhn算法(模10算法)

經過查看ISO/IEC 7812-1:2017文件能夠看到對於luhn算法的解釋,以下圖:git

Luhn算法 算法主要分爲三步: 第一步:從右邊第一位(最低位)開始隔位乘2; 第二步:把第一步所得的每個數字加入到原來的數中,好比9*2=18,爲1+8; 第三步:用以0結尾且大於第二步所得到的數的和的最小整數減去第二步所得到的和便可以得到校驗位,如70-67=3,3即爲校驗位,若是第二步全部數字的和以0結尾,好比30、40、50等,那麼校驗爲0;算法

二、IMEI校驗

IMEI碼由GSM(Global System for Mobile Communications,全球移動通訊協會)統一分配,受權BABT(British approvals Board of Telecommunications,英國通訊認證管理委員會)審受。 在TS.06 IMEI Allocation and Approval Process中規定IMEI校驗應該經過Luhn算法計算,以下圖所示: IMEI Allocation and Approval 三、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

相關文章
相關標籤/搜索