Java 身份证校验工具类(15位校验、18位校验与15转18)
文章目录
- 身份证简介
- (一)身份证号码的组成
- (二)一代和二代身份证
- 一代身份证
- 二代身份证
- 检验思路分析
- (一)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
440524450715678
18位身份证号码示例:
11010519491231001X
320322194806304528
510104194701010032
652923194602291247
440524194507156789
相关文章:
Java 身份证校验工具类(15位校验、18位校验与15转18)
文章目录 身份证简介(一)身份证号码的组成(二)一代和二代身份证一代身份证二代身份证 检验思路分析(一)15位身份证号码(二)18位身份证号码(三)校验算法示例&a…...

HTML+CSS+Vue3的静态网页,免费开源,可当作作业使用
拿走请吱一声,点个关注吧,代码如下,网页有移动端适配 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(8)
1.问题描述: 在AGC中,推送服务的消息回执新建成功后,有一个有效期 1,这个有效期是什么意思,过期后,会影响什么呢? 2,这个有效期是否可以修改成一直不过期? 解决方案&…...

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由
网络层数据封装 首先IP地址封装在网络层,它用于标识一台网络设备,其中IP地址分为两个部分,网络地址和主机地址,通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言,它细分为五类,A,B,C,D,E,…...

音频客观测评方法PESQ
一、简介 语音质量感知评估(Perceptual Evaluation of Speech Quality)是一系列的标准,包括一种用于自动评估电话系统用户所体验到的语音质量的测试方法。该标准于2001年被确定为ITU-T P.862建议书[1]。PESQ被电话制造商、网络设备供应商和电…...

前后端分离的项目使用nginx 解决 Invalid CORS request
我是这样打算的,前端用nginx代理,使用80 转443 端口走https 前端的地址就是http://yumbo.top 或https://yumbo.top 后端服务地址是:http://yumbo.top:8081 下面是我的完整配置,功能是正常的,加了注释 user nginx; …...
回归预测 | MATLAB实现SVM-Adaboost集成学习结合支持向量机多输入单输出回归预测
回归预测 | MATLAB实现SVM-Adaboost集成学习结合支持向量机多输入单输出回归预测 目录 回归预测 | MATLAB实现SVM-Adaboost集成学习结合支持向量机多输入单输出回归预测基本介绍程序设计基本介绍 SVM-Adaboost集成学习是一种将支持向量机(SVM)与AdaBoost算法相结合的集成学习…...
常见排序算法总结 (五) - 堆排序与堆操作
堆排序(借助 API) 算法思想 利用堆能够维护数组中最大值的性质,根据数组元素建立最大堆,依次弹出元素并维护堆结构,直到堆为空。 稳定性分析 堆排序是不稳定的,因为堆本质上是完全二叉树,排…...
kubernetes的三种探针ReadinessProbe、LivenessProbe和StartupProbe,以及使用示例
前言 k8s中的Pod由容器组成,容器运行的时候可能因为意外情况挂掉。为了保证服务的稳定性,在容器出现问题后能进行重启,k8s提供了3种探针 k8s的三种探针 为了探测容器状态,k8s提供了两个探针: LivenessProbe和ReadinessProbe L…...

掌握线性回归:从简单模型到多项式模型的综合指南
目录 一、说明 二、简单线性回归 三、线性回归的评估指标 3.1 线性回归中的假设 四、从头开始的简单线性回归代码 五、多元线性回归 六、多元线性回归代码 七、多项式线性回归 八、多项式线性回归代码 九、应用单变量多项式回归 十、改变多项式的次数 十一、多列多项式回归 一、…...

Java:183 基于SSM的高校食堂系统
项目介绍 基于SSM的食堂点餐系统 角色:管理员、用户、食堂 前台用户可以实现商品浏览,加入购物车,加入收藏,预定,选座,个人信息管理,收货信息管理,收藏管理,评论功能,…...

光谱相机
光谱相机是一种能够同时获取目标物体的空间图像信息和光谱信息的成像设备。 1、工作原理 光谱相机通过光学系统将目标物体的光聚焦到探测器上,在探测器前设置分光元件,如光栅、棱镜或滤光片等,将光按不同波长分解成多个光谱通道,…...

AI绘图:开源Stable Diffusion 3 ComfyUI下载安装方法
AI绘图:开源Stable Diffusion 3 ComfyUI下载安装方法 安装好后软件运行效果: 第一步:安装ComfyUI的最新版本 1、请从下面的地址下载压缩包,并解压缩到硬盘 https://github.com/comfyanonymous/ComfyUI/releases/download/late…...

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测
一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测 目录 一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现INFO-CNN-SVM向量加权算法优化卷积神经网络结…...

AES笔记整理
文章目录 1. 简介2. 密钥加法层2. 字节代换层3. 行位移 - ShiftRows4. 列混淆 - MixColumn5. 其他5.1列混淆矩阵乘法运算5.2 AES密钥生成 6. 参考资料 以下内容为信息安全开发过程中,AES对称加密算法的笔记,大部分内容转载其他文章,若描述不清…...

Jmeter 性能压测-Tomcat连接数
1、影响性能的线程状态 ①BLOCKED,如果线程中有BLOCKED,就代表有阻塞情况,需要进行排查 ②TIMED_WAITING,如果线程中有TIMED_WAITING,就代表有等待的情况,要分情况来排查 系统线程在等待(如果…...
基于Vue3的组件封装技巧分享
1、需求说明 需求背景:日常开发中,我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发,提升效率。有时我们需要进行个性化封装,以满足在项目中大量使用的需求。 错误示范:基于a-modal封装一个自定…...

python中r代表什么意思
r在python中表示什么意思? “r”是“raw”的简写。去查单词,意思是“未加工的,原料”。因此,不难想象,在python字符串前面,表示“按原样输出字符串”,也就是说字符串里的元素,原来什…...
《量子计算对人工智能发展的深远影响》
在科技发展的浪潮中,量子计算与人工智能无疑是两颗璀璨的明星,二者的融合正引领着一场深刻的科技变革. 量子计算的独特之处在于其利用量子比特的叠加和纠缠特性,能够实现并行计算,从而在处理复杂问题时展现出超越传统计算的巨大潜…...

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库
在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用,而不能在服务器组件中使用。Next.js 的新架构(App Router)中,默认情况下,页面和布局组件是服务器组件,因此不能直接使…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...