由於中國公民的身份証號碼是由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;
}