最近在做项目时遇到点小问题,这个问题是关于身份证号码的。在调试数据修改学生信息时点保存按钮弹出提示说身份证号码格式不正确,后来才知道这个问题的关键在于身份证号码的最后一位。
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码:表示编码对象常住户口所在县(县级市、旗、区)的行政区划代码,按GB/T2260的规定执行。
出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
校验码:根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
身份证的最后一位是根据前面的十七位数字码而生成的校验码,所以生成校验码就会有一个算法的存在。
1)将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;
2)将这17位数字和系数相乘的结果相加;
3)用加出来的和除以11,看余数是多少;
4)余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2;
下面用身份证随机生成器生成一个身份证然后再用算法来验证一次。
首先用身份证号码前十七位与其对应的系数相乘后求和:
4*7+4*9+0*10+1*5+1*8+5*4+2*2+0*1+1*6+8*3+0*7+1*9+0*10+1*5+4*8+7*4+3*2=211
然后把加起来的数除以十一后取余数:
211/11=19余2
最后根据余数取其对应的号码作为校验码:
0-1-2-3-4-5-6-7-8-9-10
1-0-X-9-8-7-6-5-4-3-2
2对应的是X,所以这个身份证号码就是44011520180101473X。