个人专长: 胡扯,瞎掰,软件测试稍微靠谱 (空间无原创东西,全部来源网络,如有侵权请联系本人)

实现的15位和18位身份证格式验证算法

上一篇 / 下一篇  2008-05-19 16:11:33 / 个人分类:小知识册

18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
一、范围
     该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
     公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
1、号码的结构
    公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码
    表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3、出生日期码
    表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码
     表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5、校验码
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)计算模
Y = mod(S, 11)

(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014

再看一下身份证的含义:

    '15位身份证号码含义:
    '----------------------------------------
    '113343    450321        432(身份证号:只作假设,可能此号并不存在,请勿对号入座)
    '前6位     中间6位       后三位
    '地区代码  生日:年月日  奇为男,偶为女
    '----------------------------------------
    '其中:
    '各省市地区国家代码前两位代码是:
    '----------------------------------
    '北京 11 吉林 22  福建 35 广东 44 云南 53 天津 12 黑龙江 23  江西 36 广西 45  西藏 54 河北 13  上海 31 
    '山东 37  海南 46  陕西 61  山西 14  江苏 32  河南 41  重庆 50  甘肃 62 内蒙古 15  浙江 33  湖北 42 
    '四川 51  青海 63   辽宁 21  安徽 34  湖南 43  贵州 52  宁夏 64  新疆 65  台湾 71  香港 81  澳门 82  国外 91

    '18位身份证号:
    '---------------------------------------------------
    '113343    1945  03    21    432             9(身份证号:只作假设,可能此号并不存在,请勿对号入座)
    '前6位     四位  两位  两位  三位            一位
    '地区代码  年份  月份  生日  奇为男,偶为女  检验位
    '---------------------------------------------------
    '其他不详。

下面开始进行验证页面和代码的编写(因时间问题就不想进行地区判断等代码了,大家有兴趣可以修改代码进行功能更强的验证功能)

VerifyIDCard.aspx的代码:

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="test.default_1"%>

<%@ Register TagPrefix="lion"Namespace="Lion.Web.WebHtmlEditor"Assembly="Lion.Web.WebHtmlEditor"%>
<%@ Page Language="vb"AutoEventWireup="false"Codebehind="VerifyIDcard.aspx.vb"Inherits="test.VerifyIDcard"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>身份证验证</title>
<metacontent="Microsoft Visual Studio .NET 7.1"name="GENERATOR">
<metacontent="Visual Basic .NET 7.1"name="CODE_LANGUAGE">
<metacontent="Javascrīpt"name="vs_defaultClientscrīpt">
<metacontent="http://schemas.microsoft.com/intellisense/ie5"name="vs_targetSchema">
</HEAD>
<bodyMS_POSITIONING="GridLayout">
<formid="Form1"method="post"runat="server">
<asp:labelid="Label1"runat="server">身份证验证:</asp:label>
<asp:textboxid="txtID"runat="server"Width="192px"></asp:textbox>
<asp:buttonid="CmdVerify"runat="server"Text="验证"></asp:button>
<asp:labelid="LblErr"runat="server"ForeColor="Red"></asp:label>
</form>
</body>
</HTML>


VerifyIDCard.aspx.vb的代码:

 

PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
'在此处放置初始化页的用户代码
End Sub


PrivateSubCmdVerify_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesCmdVerify.Click
SelectCaseIDCheck(txtID.Text)
Case0
LblErr.ForeColor
=System.Drawing.Color.Green
LblErr.Text
="验证通过!"
Case1
LblErr.ForeColor
=System.Drawing.Color.Red
LblErr.Text
="身份证号必须是15位数或18位数!"
Case2
LblErr.ForeColor
=System.Drawing.Color.Red
LblErr.Text
="身份证除最后一位外,必须为数字!"
Case3
LblErr.ForeColor
=System.Drawing.Color.Red
LblErr.Text
="身份证输入错误(日期输入错误)!"
Case4
LblErr.ForeColor
=System.Drawing.Color.Red
LblErr.Text
="身份证号码输入错误(身份证包含有非法字符)!"
EndSelect
End Sub



'15位和18位身份证验证
'返回参数(
'0:验证通过!
'1:身份证号必须是15位数或18位数!
'2:身份证除最后一位外,必须为数字!
'3:身份证输入错误(日期输入错误)!
'4:身份证号码输入错误(身份证包含有非法字符)!
'
'
作者:踢西
'
日期:2005-09-09
FunctionIDCheck(ByVale)AsInteger
DimarrVerifyCode
DimWi
DimChecker
DimBirthDay
IDCheck
=0'验证通过时返回
arrVerifyCode=Split("1,0,x,9,8,7,6,5,4,3,2",",")
Wi
=Split("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2",",")
Checker
=Split("1,9,8,7,6,5,4,3,2,1,1",",")
IfLen(e)<15OrLen(e)=16OrLen(e)=17OrLen(e)>18Then
'IDCheck= "身份证号必须是15位数或18位数!"
IDCheck=1
Exit Function
EndIf
DimAiAsString
IfLen(e)=18Then
Ai
=Mid(e,1,17)
ElseIfLen(e)=15Then
Ai
=CStr(e)
Ai
=Left(Ai,6)&"19"&Mid(Ai,7,9)
EndIf
IfNotIsNumeric(Ai)Then
'IDCheck= "身份证除最后一位外,必须为数字!"
IDCheck=2
Exit Function
EndIf
DimstrYearAsInteger
DimstrMonthAsInteger
DimstrDayAsInteger
strYear
=CInt(Mid(Ai,7,4))
strMonth
=CInt(Mid(Ai,11,2))
strDay
=CInt(Mid(Ai,13,2))
BirthDay
=Trim(strYear)+"-"+Trim(strMonth)+"-"+Trim(strDay)
IfIsDate(BirthDay)Then
IfDateDiff("yyyy", Now(),CDate(BirthDay))<-140OrCDate(BirthDay)>Today()Then
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck=3
Exit Function
EndIf
IfstrMonth>12OrstrDay>31Then
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck=3
Exit Function
EndIf
Else
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck=3
Exit Function
EndIf
DimiAsInteger
DimTotalmulAiWiAsInteger
Fori=0To16
TotalmulAiWi
=TotalmulAiWi+CInt(Mid(Ai, i+1,1))*CInt(Wi(i))
Next
DimmodValueAsInteger
modValue
=TotalmulAiWiMod11
DimstrVerifyCode'As Object
strVerifyCode=arrVerifyCode(modValue)
Ai
=Ai&strVerifyCode
IfLen(e)=18AndCStr(e)<>AiThen
'IDCheck= "身份证号码输入错误(身份证包含有非法字符)!"
IDCheck=4
Exit Function
EndIf
End Function

 

下面我们进行对身份进行验证,看是否能够正确常:

 

验证错误,无法通过验证,因18位数的身份证最后一位数是由前十七位数字本体码加权求和公式算出来的,换成其它数字或字母都是错误的呵,不信你试试,哈哈!


TAG: 小知识册

shen1936的个人空间 引用 删除 shen1936   /   2008-05-20 09:36:50
这个我也说不好。不过网上公布的算法是这样的。
双面人的个人空间 引用 删除 双面人   /   2008-05-19 17:19:23
奇为男,偶为女,
不对吧,我的是2,是偶数,但偶可是个男人哦
 

评分:0

我来说两句

日历

« 2024-05-01  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 52588
  • 日志数: 84
  • 文件数: 3
  • 建立时间: 2008-04-02
  • 更新时间: 2009-03-23

RSS订阅

Open Toolbar