身份证号校验,身份证校验工具

4747 492 2022-09-11

本文讲述了身份证号校验,身份证校验工具。

描述‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

中国目前采用的是18位身份证号,其第7-10位数字是出生年,11-12位是出生月份,13-14是出生日期,第17位是性别,奇数为男性,偶数为女性,第18位是校验位。 如果身份证号码的其中一位填错了(包括最后一个校验位),则校验算法可以检测出来。如果身份证号的相邻2位填反了,则校验算法可以检测出来。校验规则如下:‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。   2. 将这17位数字和系数相乘的结果相加。   3. 用加出来和除以11,看余数只可能是:0-1-2-3-4-5-6-7-8-9-10 分别对应的最后一位身份证的号码为:1-0-X-9-8-7-6-5-4-3-2   4. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X(大写英文字母X)。如果余数是10,身份证的最后一位号码就是2。 用户输入一个身份证号,校验其是否是合法的身份证号码。

输入格式‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

一个18位身份证号,末位为数字或大写字母X‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

输出格式‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

'身份证号码校验为合法号码!' 或 '身份证校验位错误!'‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

示例 1‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

输入:220221197302286534

输出:身份证校验位错误!

示例 2‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

输入:220221197302296536

输出:身份证号码校验为合法号码!

ls = ( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 )

id = input()

sum = 0

for i in range(17):

    sum = sum + ls[i] * int(id[i])

if str(id[17]) == 'X':

    if sum % 11 == 2:

        print('身份证号码校验为合法号码!')

    else:

        print('身份证校验位错误!')

elif (sum % 11 + int(id[17])) % 11 == 1:

    print('身份证号码校验为合法号码!')

else:

    print('身份证校验位错误!')

很多项目业务都会设计到人员信息,那么身份证号就是必不可少的校验项。

为了方便大家,我把项目中用到的身份证校验Utils分享给大家,创造不易,如果帮助到你,希望大家多多点赞。

import com.google.common.base.Strings;

import java.util.stream.IntStream;

/**

 * 身份证号码验证

 * 1、号码的结构

 * 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。从左至右依次为:六位数字地址码,

 * 八位数字出生日期码,三位数字顺序码和一位数字校验码。

 * 2、地址码(前六位数)

 * 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

 * 3、出生日期码(第七位至十四位)

 * 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

 * 4、顺序码(第十五位至十七位)

 * 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,

 * 顺序码的奇数分配给男性,偶数分配给女性。

 * 5、校验码(第十八位数)

 * (1)十七位数字本体码加权求和公式 S = Sum(Ai Wi), i = 0, , 16 ,先对前17位数字的权求和 ;

 * Ai:表示第i位置上的身份证号码数字值; Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

 * (2)计算模 Y = mod(S, 11)

 * (3)通过模( 0 1 2 3 4 5 6 7 8 9 10)得到对应的校验码 Y:1 0 X 9 8 7 6 5 4 3 2

 */

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"};

    private static final String IDENTITY_PATTERN = "^[0-9]{17}[0-9Xx]$";

    //身份证号脱敏

    public static String desensitizedIdNumber(String idNumber){

        if (!Strings.isNullOrEmpty(idNumber)) {

            if (idNumber.length() == 15){

                idNumber = idNumber.replaceAll("(\\w{6})\\w*(\\w{3})", "$1******$2");

            }

            if (idNumber.length() == 18){

                idNumber = idNumber.replaceAll("(\\w{6})\\w*(\\w{3})", "$1*********$2");

            }

        }

        return idNumber;

    }

    //身份证号校验

    public static boolean isLegalPattern(String identity) {

        if (identity == null) {

            return false;

        }

        if (identity.length() != 18) {

            return false;

        }

        if (!identity.matches(IDENTITY_PATTERN)) {

            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);

        if (lastChar.equalsIgnoreCase(mantissa)) {

            return true;

        } else {

            return false;

        }

    }

}

上文是我小编为大家整理的身份证号校验,身份证校验工具。

国内(北京、上海、广州、深圳、成都、重庆、杭州、西安、武汉、苏州、郑州、南京、天津、长沙、东莞、宁波、佛山、合肥、青岛)身份证校验分析、比较及推荐。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:k8s部署nacos,docker运行nacos
下一篇:k8s中部署的Prometheus.yaml的解释说明&监控数据挂载在NFS上
相关文章

 发表评论

暂时没有评论,来抢沙发吧~