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)中,默认情况下,页面和布局组件是服务器组件,因此不能直接使…...
CNN 卷积神经网络
1. 图像基本概念 2. CNN概述 3. 卷积层 3.1 卷积计算 卷积计算 本质上是 卷积核 和 输入数据的局部区域 间做点积; 计算规则:从左到右,从上到下; 3.1.1 Padding 填充 - 填充的像素个数 通过上面的卷积计算过程,最终的…...
大学生证书分为哪几种?2026年最新含金量排名与考证避坑指南
嗨,各位正在象牙塔里奋斗或者即将步入社会的同学们!👋转眼间我们已经迈入了2026年,就业市场的风向标其实每天都在发生细微的变化。我特别能理解大家现在的焦虑感——看着周围的同学都在疯狂刷题考证,自己如果不考点什么…...
长期使用Taotoken Token Plan套餐的成本控制感受分享
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken Token Plan套餐的成本控制感受分享 1. 从按量计费到套餐订阅的转变 在开始使用Taotoken平台时,我们…...
MoE架构揭秘:万亿参数大模型如何实现2%活跃率
1. 项目概述:当“参数规模”不再等于“实际计算量”你可能已经看过不少标题党文章,比如“GPT-4参数量突破1.8万亿!”——但真正值得细品的,是后半句:“它每处理一个词(token),只动用…...
3步搞定M3U8视频下载:告别在线播放限制的终极方案
3步搞定M3U8视频下载:告别在线播放限制的终极方案 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 你是否曾遇到过这样的烦恼?在线观看的视频无法保存&…...
AI智能切片不是‘一键分割’就完事:批量口播视频的工程化切片陷阱与工具选型
Hook你是否试过把一小时口播音频丢进某款‘AI切片工具’,结果导出37条视频——其中12条开头卡在‘呃…’上,8条结尾截断在半句话里,还有5条字幕和画面完全不同步?更糟的是,换一批素材,模型表现又不稳定。这…...
TDengine Tag 设计哲学与 Schema 变更机制
2.数据模型 > 04 Tag 设计哲学与 Schema 变更机制 — 静态属性建模与在线结构演进 适用版本:TDengine v3.x(v3.3.x / v3.4.x) | 最后更新:2026-05-16 概述 Tag(标签)是 TDengine 数据模型中区别于传统…...
轻松实现颜色与数字的映射:Python 数据处理实战
在数据分析与日常数据处理中,我们经常需要将文本信息转换为数值型数据,尤其在颜色编码、分类标签等场景中尤为常见。 今天,我将分享一个简单实用的 Python 示例,演示如何利用 pandas 库将颜色名称映射为对应的数字,并将…...
Claude Code 终端命令完整指南
引言最初是为了方便我个人学习使用Claude Code才去网络上收集各种终端命令,但想到可能有人同样需要知道这些命令,便打算将其整理发到CSDN上,希望能帮到大家。 有点标题党的是本文并不是真的完整指南,毕竟完整的命令太多了…...
服务注册与发现完全指南
服务注册与发现完全指南 前言 在微服务架构中,服务注册与发现是实现服务间通信的基础设施。服务注册中心维护着所有服务的实例信息,使得服务消费者能够动态地发现和调用服务提供者。本文将详细介绍服务注册与发现的核心概念、实现机制以及最佳实践。 一、…...
