爱收集资源网

【程序员大咖】博客园号码的结构公民身份号码计算

网络整理 2022-05-07 20:05

点击上方蓝色字体关注“程序员”

来自:旭东的博客-博客园

做项目的时候身份证上的校验码是什么作用,需要对获取的数据进行“清理”,比如去掉一些不可能的ID号。网上查了身份证号码验证算法,自己总结了一下。

(一)ID号的18位结构

公民身份证号码是一种功能组合码,由十七位身体码和一位验证码组成。

从左到右依次为:六位地址码、八位出生日期码、三位序列码和一位校验码。

1、地址码

表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

2、生日密码

表示编码对象的出生年月日,按GB/T7408的规定执行,年月日编码之间不存在分隔符。

3、序列码

表示分配给同一地址代码所标识区域内同一年、月、日出生的人的序列号。序号的奇数分配给男性,偶数分配给女性。

4、校验码计算步骤

(1)17位本体码加权求和公式

S = Sum(Ai * Wi), i = 0, ... , 16 ,先将前17位的权重相加

安全阀 在线 校验 冷态 校验 是 什么意思_js校验18位身份证号_身份证上的校验码是什么作用

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)! ! !返回搜狐,查看更多

博客园 身份证号码