裕华建设集团网站,制作一个网站需要多少小时,三字广告公司名称,cms 网站群文章目录 身份证简介#xff08;一#xff09;身份证号码的组成#xff08;二#xff09;一代和二代身份证一代身份证二代身份证 检验思路分析#xff08;一#xff09;15位身份证号码#xff08;二#xff09;18位身份证号码#xff08;三#xff09;校验算法示例一身份证号码的组成二一代和二代身份证一代身份证二代身份证 检验思路分析一15位身份证号码二18位身份证号码三校验算法示例18位 编写代码一创建工具类IdentityUtils二创建isLegalIdCard方法三创建is15BitLegalIdCard方法四创建is18BitLegalIdCard方法五创建convert15To18BitIdCard方法六创建测试类 运行测试 身份证简介
身份证校验是指通过一定规则和算法对身份证号码进行真实性核验的过程主要是为了确保个人身份信息的准确性和安全性。
一身份证号码的组成
我国公民身份证号码一般为18位由以下四部分组成
地址码前6位数字表示编码对象常住户口所在县市、旗、区的行政区划代码。出生日期码接下来的8位数字表示编码对象出生的年、月、日其中年份用四位数字表示年、月、日之间不用分隔符。顺序码第15至17位数字表示在同一地址码所标识的区域范围内对同年、同月、同日出生的人员编定的顺序号。顺序码的奇数分给男性偶数分给女性。校验码最后一位数字是根据前面十七位数字码按照ISO 7064:1983标准的MOD 11-2校验算法计算得出的检验码。
二一代和二代身份证
一代身份证 发布时间与停用时间 发布时间1984年。停用时间2013年1月1日。 外观与规格 采用聚酯薄膜密封、单页卡式设计。尺寸为特定规格但具体尺寸未明确提及与二代证不同。15位编码。 制作技术与防伪措施 最初采用印刷和照相翻拍技术塑封而成。防伪性能相对较差比较容易被伪造。1995年7月1日起启用新的防伪居民身份证采用全息透视塑封套防伪技术。 信息内容 包括姓名、性别、民族、出生日期、常住户口所在地住址等基本信息。最初发放的身份证中有一部分是用手工填写的。不包含“婚姻状况”和“职业”等内容。 有效性与使用范围 在有效期内继续有效但自2013年起停止使用。用于常住户口登记项目变更、兵役登记、婚姻登记、收养登记、申请办理出境手续等场合。
二代身份证 发布时间与换发时间 发布并实施时间依据2003年6月28日通过的《中华人民共和国居民身份证法》。换发时间自2004年1月1日起开始换发。 外观与规格 采用多层聚酯材料复合而成的单页卡式设计。尺寸为85.6mm×54.0mm×1.0mm四角为圆角。正面印有国徽、证件名称、长城图案、签发机关和有效期以及彩虹扭索花纹背面印有姓名、性别、民族、出生日期、常住户口所在地住址、公民身份号码和本人相片。 制作技术与防伪措施 采用非接触式IC卡技术制作具备视读和机读两种功能。芯片存储量大信息可划分安全等级并分区存储。表面采用防伪膜和多项印刷防伪技术如彩虹印刷、荧光印刷、定向光变色膜等。 信息内容 包含姓名、性别、民族、出生日期、常住户口所在地住址、公民身份号码等基本信息。公民身份号码为18位其中前6位为地区码中间8位为出生年月日后3位为顺序码最后1位为校验码。 有效性与使用范围 按年龄区域划分使用期限未满16周岁为5年16至25周岁为10年26至45周岁为20年46周岁以上为长期有效。用于各类需要身份验证的场合如银行、机场、酒店等。在公安、社保、医疗等领域自动采集和录入相关数据提高工作效率和准确性。
检验思路分析
15位和18位身份证的检验思路分析主要涉及到身份证号码的组成规则以及校验方法的了解。以下是对两者的详细检验思路
一15位身份证号码 格式检查 确认身份证号码长度为15位。检查每一位是否都是数字。 组成规则分析 前6位地区编码表示身份证持有人的户籍所在地。第7-8位出生年份的后两位。第9-10位出生月份。第11-12位出生日期。第13-14位顺序码为随机数用于区分同年同月同日出生的不同个体。第15位性别码奇数为男性偶数为女性。 校验内容 年份检查年份是否在合理范围内如1900-1999年的后两位。月份检查月份是否在01-12之间。日期检查日期是否在01-31之间注意不同月份的天数差异。性别根据第15位判断性别是否符合奇数为男、偶数为女的规则。
二18位身份证号码 格式检查 确认身份证号码长度为18位。检查前17位是否都是数字最后一位可以是数字或字母X代表10。 组成规则分析 前6位地区编码表示身份证持有人的户籍所在地。第7-14位出生年月日完整的8位数字格式为YYYYMMDD。第15-17位顺序码其中第17位还用于表示性别奇数为男性偶数为女性。第18位校验码根据前17位数字通过特定算法计算得出。 校验内容 地区码需与全国行政区划代码一致可通过查询最新的行政区划代码表进行验证。出生日期需符合日期格式YYYYMMDD且年份应在合理范围内如当前年份的前几十年至建国初期。顺序码第17位需根据性别规则进行校验奇数表示男性偶数表示女性。校验码按照特定算法计算前17位的加权和取模后得到余数再根据余数在校验码对照表中查找对应的校验码。如果计算出的校验码与身份证号码中的第18位一致则校验通过否则校验不通过。
三校验算法示例18位
将前17位数字分别乘以对应的加权因子7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2。将乘积相加得到总和。将总和除以11得到余数。根据余数在校验码对照表1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2中查找对应的校验码。
编写代码
一创建工具类IdentityUtils
public class IdentityUtils { // 权重因子 private static final int[] COEFFICIENT_ARRAY {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 校验码字符集 private static final String[] IDENTITY_MANTISSA {1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2}; // 15位身份证正则表达式 private static final String IDENTITY_PATTERN_15 ^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}$; // 18位身份证正则表达式 private static final String IDENTITY_PATTERN_18 ^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}[0-9Xx]$;
} 二创建isLegalIdCard方法
基础校验判断身份证位数是否位15位或18位、是否为空。
public static boolean isLegalIdCard(String identity) {if (identity null) { return false; } if (identity.length() 15) { return is15BitLegalIdCard(identity); } if (identity.length() 18) { return is18BitLegalIdCard(identity); } return false;
} 三创建is15BitLegalIdCard方法
简易校验15位身份证号码是否合法年份、月份、日期和性别。
public static boolean is15BitLegalIdCard(String identity) { // 正则表达式用于初步格式检查 if (!identity.matches(IDENTITY_PATTERN_15)) { return false; } // 提取年份后两位、月份、日期和顺序码含性别码 String yearStr identity.substring(6, 8); String monthStr identity.substring(8, 10); String dayStr identity.substring(10, 12); String sequenceStr identity.substring(12, 15); // 检查年份是否在合理范围内1900-1999年的后两位 int year Integer.parseInt(yearStr); if (year 0 || year 99) { return false; } // 检查月份和日期是否在合理范围内 int month Integer.parseInt(monthStr); int day Integer.parseInt(dayStr); if (month 1 || month 12 || day 1 || day 31) { return false; } // 检查性别码第15位奇数为男性偶数为女性 int genderCode Integer.parseInt(sequenceStr.substring(sequenceStr.length() - 1));if (genderCode 0 || genderCode 9 ) { return false; } return true;
} 四创建is18BitLegalIdCard方法
简易校验18位身份证号码是否合法校验码。
public static boolean is18BitLegalIdCard(String identity) { // 正则表达式用于初步格式检查 if (!identity.matches(IDENTITY_PATTERN_18)) { return false; } // 将字符串对象中的字符转换为一个字符数组 char[] chars identity.toCharArray(); long sum IntStream.range(0, 17).map(index - { char ch chars[index]; // 通俗理解digit()是个边界值判断不过边界返回字符数字本身数值超过边界即返回 -1. int digit Character.digit(ch, 10); int coefficient COEFFICIENT_ARRAY[index]; return digit * coefficient; }).summaryStatistics().getSum(); // 计算出的尾数索引 int mantissaIndex (int) (sum % 11); String mantissa IDENTITY_MANTISSA[mantissaIndex]; String lastChar identity.substring(17); return lastChar.equalsIgnoreCase(mantissa);
} 五创建convert15To18BitIdCard方法
简易转换15位身份证号码转18位身份证号码。
public static String convert15To18BitIdCard(String identity) { if (!is15BitLegalIdCard(identity)) { throw new IllegalArgumentException(Invalid 15-bit ID card number); } // 提取各个部分 String regionCode identity.substring(0, 6); String year identity.substring(6, 8); String month identity.substring(8, 10); String day identity.substring(10, 12); String orderCode identity.substring(12); // 将年份扩展为四位 int yearInt Integer.parseInt(year); String extendedYear (yearInt 30 ? 19 : 20) year; // 组合成17位不含校验码 String idWithoutCheckCode regionCode extendedYear month day orderCode; // 计算校验码 int checkSum 0; for (int i 0; i 17; i) { checkSum Character.getNumericValue(idWithoutCheckCode.charAt(i)) * COEFFICIENT_ARRAY[i];} int mod checkSum % 11; String checkCode IDENTITY_MANTISSA[mod]; // 组合成18位 return idWithoutCheckCode checkCode;
} 六创建测试类
package net.army.com.experiment.experiment03;import java.util.Scanner;/*** 功能身份证校验测试* 日期2024年11月16日* 作者梁辰兴*/
public class IDNumber {public static void main(String[] args) {Scanner sc new Scanner(System.in);while (true) {System.out.print(请输入身份证号码);String number sc.next();if (IdentityUtils.isLegalIdCard(number)) {if (IdentityUtils.is15BitLegalIdCard(number)) {System.out.println(身份证号码number 为标准15位身份证);String newNumber IdentityUtils.convert15To18BitIdCard(number);System.out.println(转换为18位标准身份证号码newNumber);break;} else if (IdentityUtils.is18BitLegalIdCard(number)) {System.out.println(身份证号码number 为标准18位身份证);break;}} else {System.out.println(number 不是合法身份证请重新输出);}}}
}
运行测试
15位身份证号码示例
110105491231001
320322480630452
510104470101003
652923460229124
44052445071567818位身份证号码示例
11010519491231001X
320322194806304528
510104194701010032
652923194602291247
440524194507156789