点击上方蓝色字体关注“程序员”
来自:旭东的博客-博客园
做项目的时候身份证上的校验码是什么作用,需要对获取的数据进行“清理”,比如去掉一些不可能的ID号。网上查了身份证号码验证算法,自己总结了一下。
(一)ID号的18位结构
公民身份证号码是一种功能组合码,由十七位身体码和一位验证码组成。
从左到右依次为:六位地址码、八位出生日期码、三位序列码和一位校验码。
1、地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2、生日密码
表示编码对象的出生年月日,按GB/T7408的规定执行,年月日编码之间不存在分隔符。
3、序列码
表示分配给同一地址代码所标识区域内同一年、月、日出生的人的序列号。序号的奇数分配给男性,偶数分配给女性。
4、校验码计算步骤
(1)17位本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先将前17位的权重相加
Ai:表示ID号在第i个位置的数字值(0~9)
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(代表第i个位置的权重因子)
(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
(二)根据17位正文码获取最后一个校验码的程序示例
publicclassId18{ int[] weight={ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 十七位本体码权重 char[] validate={ '1', '0', 'X', '9', '8', '7', '6', '5', '4', ' 3','2'}; //mod11,对应校验码字符值 publicchargetValidateCode(String id17){ intsum= 0; intmode= 0; for( inti= 0;i11; returnvalidate[mode]; } publicstaticvoidmain( String[] args) { Id18 test= newId18(); System.out.println( "身份证验证码:"+test.getValidateCode("14230219700101101")); //身份证验证码:3 } }
(三)说明
1、程序可以根据已有的17位正文码获取对应的验证码。
2、此程序可以删除验证码不正确的身份证号码。
3、15位身份证的出生年份为年份的最后2位,没有最后一位校验码。
4、完整的身份证有18位数字,最后一个校验位可能是非数字。在我们的一个项目中,数据库保存了前17位,可以加速一些SQL语句(比如inner join)! ! !返回搜狐,查看更多