由於中國公民的身份証號碼是由18位數字(最後一位可能是X,代表10)組成,人們在輸入自己的身份證號碼容易出錯。所以,作爲開發者應該按照算法進行校驗,可以將輸錯身份證號碼的幾率降低到千萬分之一( 不可能完全確保準確)

以下是檢驗算法(javascript):

//code:身份証號碼
function VerifyIdNumber(code){
	//debugger
	if(code.length!=18){
		return false;
	}
	var rex=/^\d{17}[0-9xX]{1}$/;
	if(rex.test(code)==false){
		return false;
	}
	var factor=[];//Wi
	for(var i=0;i<18;i++){
		factor.push(Math.pow(2,i)%11);
	}
	var codeArray=[];
	codeArray = code.split("").reverse();
	var numberArray=[];//Ai
	for(var i=0;i<codeArray.length;i++){
		if(codeArray[i].toLowerCase()=="x"){
			numberArray.push(10);
		}else{
			numberArray.push(Number(codeArray[i]));
		}
	}
	var sums=0;//和
	for(var i=0;i<numberArray.length;i++){
		sums+=numberArray[i]*factor[i];
	}
	return sums%11==1;
}

C#版本:

/// <summary>
/// 验证身份证是否正确合理
/// Author:Lui
/// </summary>
/// <param name="cardNumber">身份证号</param>
/// <returns></returns>
public static bool ValidIdCard(this string cardNumber)
{
    if (cardNumber.Length != 18)
    {
        return false;
    }
    var rex = "^\\d{17}[0-9xX]{1}$";
    if (Regex.IsMatch(cardNumber, rex) == false)
    {
        return false;
    }
    var factor = new double[18];//Wi
    for (var i = 0; i < 18; i++)
    {
        factor[i] = (Math.Pow(2, i) % 11);
    }
    char[] codeArray = cardNumber.Reverse().ToArray();
    int[] numberArray = new int[18];//Ai
    for (var i = 0; i < codeArray.Length; i++)
    {
        if (codeArray[i].ToString().ToLower() == "x")
        {
            numberArray[i] = (10);
        }
        else
        {
            numberArray[i] = (int.Parse(codeArray[i].ToString()));
        }
    }
    var sum = 0d;//和
    for (var i = 0; i < numberArray.Length; i++)
    {
        sum += numberArray[i] * factor[i];
    }
    return sum % 11 == 1;
}