问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

身份证号码升级,你get了吗?

创作时间:
作者:
@小白创作中心

身份证号码升级,你get了吗?

引用
CSDN
6
来源
1.
https://blog.csdn.net/zgrkaka/article/details/80341068
2.
https://m.blog.csdn.net/m0_62617719/article/details/143987969
3.
https://cloud.baidu.com/article/3337847
4.
https://m.blog.csdn.net/m0_62617719/article/details/143988352
5.
https://zh.wikipedia.org/wiki/%E9%A6%99%E6%B8%AF%E8%BA%AB%E4%BB%BD%E8%AD%89
6.
https://www.cnblogs.com/tobeeasyman/p/18617393

随着信息技术的快速发展,我国居民身份证号码从15位升级到18位,这一变化不仅提升了个人信息的安全性,也更好地适应了现代化管理的需求。本文将详细介绍这一升级过程的规则,并通过Java代码实现具体的转换逻辑。

01

升级规则与校验码计算

年份扩展规则

15位身份证号码中的年份只有两位,例如95。升级到18位时,需要将其扩展为四位。具体规则是:

  • 如果年份大于30(即3099),则在前面加19,例如95变为1995
  • 如果年份小于等于30(即0030),则在前面加20,例如28变为2028

校验码计算方法

18位身份证号码的最后一位是校验码,用于验证号码的有效性。校验码的计算方法如下:

  1. 将前17位数字分别乘以对应的系数:7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
  2. 将乘积相加得到总和。
  3. 将总和除以11,得到余数。
  4. 根据余数在映射表中查找对应的校验码。映射表为:1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2

例如,对于号码12345619780101001

  • 计算乘积和:1*7 + 2*9 + 3*10 + ... + 1*2 = 100
  • 计算余数:100 % 11 = 1
  • 查找校验码:映射表中第1位是1,所以校验码是1
02

Java代码实现

下面是一个完整的Java代码示例,用于将15位身份证号码升级为18位:

public class IdCardConverter {

    // 权重因子
    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位身份证号码转换为18位
     * @param identity 15位身份证号码
     * @return 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;
    }

    /**
     * 验证是否是合法的15位身份证号码
     * @param identity 身份证号码
     * @return 是否合法
     */
    private static boolean is15BitLegalIdCard(String identity) {
        // 简单验证长度和数字组成
        if (identity == null || identity.length() != 15) {
            return false;
        }
        for (int i = 0; i < 15; i++) {
            if (!Character.isDigit(identity.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String id15 = "110105491231001";
        String id18 = convert15To18BitIdCard(id15);
        System.out.println("15位身份证号码:" + id15);
        System.out.println("升级后的18位身份证号码:" + id18);
    }
}
03

运行示例

以15位身份证号码110105491231001为例,运行上述代码:

15位身份证号码:110105491231001
升级后的18位身份证号码:11010519491231001X

通过这个简单的Java程序,我们可以轻松地将15位身份证号码升级为18位,确保个人信息的准确性和安全性。这一升级过程不仅体现了技术的进步,也反映了国家对个人信息管理的日益重视。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号