身份号码校验

原创 2004年06月25日 16:33:00

根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

    地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。

ISO 7064:1983 标准(mod 11-2):
7,9,10,5,8,4,2,1,6,3是10个循环的权值,
对前17个数字使用就成了 7,9,10,5,8,4,2,1,6,3   7,9,10,5,8,4,2,(1,6,3)
每一个数字加权和对11取模后用下表(一个反相错位表)转换就可以算出来
0 1 2 3 4 5 6 7 8 9 10
1 0 X 9 8 7 6 5 4 3 2  (X=10)


下面举例说明该计算方法,来验证身份证最后一位校验位是否正确。

某男性公民身份号码本体码为34052419800101001X,首先按照公式⑴计算:

∑(ai×Wi)(mod 11)……………………………………(1)

公式(1)中:
i----表示号码字符从由至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。

i       18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1

ai       3  4  0  5  2  4  1  9  8  0  0  1  0  1  0  0  1 a1

Wi       7  9 10  5  8  4  2  1  6  3  7  9 10  5  8  4  2  1

ai×Wi  21 36  0 25 16 16  2  9 48  0  0  9  0  5  0  0  2 a1

根据公式(1)进行计算:

∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189

189 ÷ 11 = 17 + 2/11

∑(ai×Wi)(mod 11) = 2

    然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:

∑(ai×WI)(mod 11)   0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai       1 0 X 9 8 7 6 5 4 3  2
    根据上表,查出计算结果为2的校验码为X,所以该人员的公民身份号码应该为 34052419800101001X,是正确的。


一下是 C 的代码示例:

bool validateIDcard(char tmpStr[])
{
 int W[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
 char A[11]={'1','0','x','9','8','7','6','5','4','3','2'};
 long sum;
 int i;

 sum=0;
 for(i=0;i<17;i++)
 {
  sum = sum + W[i] * (tmpStr[i] - 0x30);
 }

 sum = sum%11;

 if(A[sum]==tmpStr[17])
 {
  return true;
 }
 else
 {
  return false;
 }
}


贴一段我写的代码给你吧 VC的,自己看算法吧

void CIDCard_VerifyDlg::OnVerify()
{
 // TODO: Add your control notification handler code here
 CString strValue = "1234567890X";
 CString strTemp;
 int nCompute1 = 0,nCompute2 = 0;
 UpdateData();
 if(m_InputIDCard.IsEmpty() || (m_InputIDCard.GetLength() != 18))
 {
  AfxMessageBox("身份证号输入无效,请重新输入(身份证号输入为空,或者18位)");
  GetDlgItem(IDC_INPUTIDCard)->SetFocus();
  return;
 }
 
    if(m_InputIDCard.GetLength() > 15)
 {
  strTemp = m_InputIDCard.Right(1);
  nCompute1 = atoi(m_InputIDCard.Mid(1,1)) * 7
   + atoi(m_InputIDCard.Mid(2,1)) * 9
   + atoi(m_InputIDCard.Mid(3,1)) * 10
   + atoi(m_InputIDCard.Mid(4,1)) * 5
   + atoi(m_InputIDCard.Mid(5,1)) * 8
   + atoi(m_InputIDCard.Mid(6,1)) * 4
   + atoi(m_InputIDCard.Mid(7,1)) * 2
   + atoi(m_InputIDCard.Mid(8,1)) * 1
   + atoi(m_InputIDCard.Mid(9,1)) * 6
   + atoi(m_InputIDCard.Mid(10,1)) * 3
   + atoi(m_InputIDCard.Mid(11,1)) * 7
   + atoi(m_InputIDCard.Mid(12,1)) * 9
   + atoi(m_InputIDCard.Mid(13,1)) * 10
   + atoi(m_InputIDCard.Mid(14,1)) * 5
   + atoi(m_InputIDCard.Mid(15,1)) * 8
   + atoi(m_InputIDCard.Mid(16,1)) * 4
   + atoi(m_InputIDCard.Mid(17,1)) * 2;  
  nCompute2 = nCompute1%11;
        if(strValue.Mid(nCompute2+1,1)!=strTemp)
  {
   //AfxMessageBox(strTemp+ "," + strValue.Mid(nCompute2+1,1));
   AfxMessageBox("身份证号输入无效,请重新输入");   
  }
  else
  {
   AfxMessageBox(m_InputIDCard + "校验通过");   
  }

 }
 
}

身份证规则验证 Java代码

未来可能会用,暂留(未验证) 出处:http://blog.csdn.net/suncaoyong/article/details/8647037 package com.haier.hmm...
  • fssf0079
  • fssf0079
  • 2014年02月12日 15:47
  • 4553

java身份证合法性校验

直接上代码,里面有测试类/** * 身份证前6位【ABCDEF】为行政区划数字代码(简称数字码)说明(参考《GB/T 2260-2007 中华人民共和国行政区划代码》): * 该数字码的编制原则和...
  • lib739449500
  • lib739449500
  • 2015年01月30日 13:47
  • 20998

java身份证号码校验、邮箱校验、手机号码/电话号码校验

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor...
  • li396864285
  • li396864285
  • 2014年06月18日 15:45
  • 2080

JAVA通过身份证号码获取身份、年月、性别、校验码信息

一个很简单的小案例 也就是获取每一个字符进行比较 思路一 可以通过把数字转换成字节 直接进行判断比较思路二 通过数组存储字符,再提取出来进行比较这里是直接转换成字节来操作 个人感觉更简单直接...
  • blackwait
  • blackwait
  • 2016年09月30日 19:42
  • 352

公民身份号码升位在SYBASE数据库上的实现.doc

  • 2011年06月06日 15:06
  • 37KB
  • 下载

手机上的微信或支付宝等APP具有识别银行卡上账号的功能,以此为示例,请基于OpenCV编程自动识别身份证上面身份号码

  • 2018年01月15日 11:40
  • 2.85MB
  • 下载

android 获取imei(国际移动设备身份码)号码详解及其应用场景

IMEI简介: IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每...
  • t12x3456
  • t12x3456
  • 2012年08月20日 22:29
  • 11554

【DAY.10】php判断18位身份账号码是否正确(基于加权算法)

思路:18位身份证号码,前17位配合加权因子加权求和,在通过取模11,获取校验码所在的key,最后匹配第18位与所取得的key是否相符,来判断是否符合 注意点:函数录入变量时,如果类型为整形,php...
  • phpbook
  • phpbook
  • 2017年03月07日 20:24
  • 219

android 获取imei(国际移动设备身份码)号码详解及其应用场景

IMEI简介: IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它...
  • iiidasol
  • iiidasol
  • 2014年08月23日 14:00
  • 504

汇编语言: .根据《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定,公民 身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依 次为:六位数字地

.根据《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定,公民 身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依 次为:六位数字地址码,八位数...
  • Shuphen
  • Shuphen
  • 2017年06月07日 20:47
  • 891
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:身份号码校验
举报原因:
原因补充:

(最多只允许输入30个字)