身份证号码算法解析与Java代码实现

中国的身份证号码是一串唯一的标识符,由18位数字组成,用于标识中国公民的个人信息。它不仅包含个人的出生日期和顺序码,还包含了地区信息。下面我们将介绍中国身份证号码的结构以及验证算法,并提供了相应的Java代码示例。

身份证号码结构

  1. 前1-6位代表所在地区的行政区划代码。
  2. 第7-14位代表持有人的出生年月日,例如19900101代表1990年1月1日。
  3. 第15-17位是同一地区、同一出生日期和同一性别的人的顺序码。
  4. 第18位为校验码,用于验证身份证号码的有效性。

身份证号码验证算法

根据中国身份证号码的编码规则,可以通过以下步骤验证身份证号码的有效性:

  1. 首先使用正则表达式验证身份证号码的基本格式是否正确。
  2. 接着计算前17位的加权和,加权系数为固定值。
  3. 根据加权和计算出的结果,与校验码进行比对验证身份证号码的正确性。

以下是用Java实现的身份证号码验证代码示例:

java 复制代码
javaCopy code
import java.util.regex.Pattern;

public class ChineseIDValidator {

    public static boolean isValidID(String id) {
        String pattern = "^[1-9]\\d{16}[0-9Xx]$";
        if (!Pattern.matches(pattern, id)) {
            return false;
        }

        // 获取身份证前17位
        String id17 = id.substring(0, 17);
        char[] chars = id17.toCharArray();
        int[] coefficient = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
        char[] verifyCode = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += (chars[i] - '0') * coefficient[i];
        }
        char lastChar = id.charAt(17);
        if (lastChar == 'x' || lastChar == 'X') {
            lastChar = 'X';
        }
        return lastChar == verifyCode[sum % 11];
    }

    public static void main(String[] args) {
        String id1 = "11010519491231002X";
        String id2 = "11010519491231002x";
        String id3 = "12345678901234567";
        System.out.println(id1 + " is valid: " + isValidID(id1));
        System.out.println(id2 + " is valid: " + isValidID(id2));
        System.out.println(id3 + " is valid: " + isValidID(id3));
    }
}

以上代码示例通过正则表达式验证身份证号码格式的正确性,并使用特定的算法验证了身份证号码的合法性。

希望本文能够帮助读者了解中国身份证号码的编码规则以及验证算法,并在实际应用中起到一定的指导作用。

相关推荐
天天被压力8 分钟前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力14 分钟前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A29 分钟前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵31 分钟前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
严肃小白兔1 小时前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
nice_lcj5201 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
微小的鱼1 小时前
Linux的渲染与显示系统链路
android·java·linux
青少儿编程课堂2 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
若亦_2 小时前
Java中关于this的三种用法
java·开发语言·intellij-idea
山甫aa2 小时前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web