身份证mod11-2校验规则

这几天碰到一个需求是实现身份证最后一位的校验,需求文档里面写了个公式,没看懂(数学早就还给老师了),于是各种查资料,发现网上的资料要么只给了说明,要么给了个固定的代码,但是写的不清不楚的,没有说明为什么要这么写,现在我就自己这几天搜集到的资料做一个简单的总结

 

首先mod11-2校验规则是遵循了一个国际标准,关于mod11-2校验规则的资料自行百度,这里就不做详细解释了

其次用java实现mod11-2校验规则的时候,一个特别要注意的点,就是加权因子,网上的代码大都是写死了一个数组:int[] coefficients = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2},也没个说明,鬼tmd的知道这个数组是个什么玩意儿,实际上这个是mod11-2校验规则中规定的计算加权因子的公式计算出来的结果,因为我们的身份证一般的是18位,最后一位可能是字母X,所以计算加权因子的时候,只算17位,那么这个计算公式是什么呢,其实很简单,就是2的(18-i)次方结果再对11取模的结果,就是下面的代码:

    //身份证前17位每一位对应的加权因子private static int[] weightingFactor() {int[] weightingFactor = new int[17];for (int i = 1; i < 18; i++) {weightingFactor[i - 1] = (int) (Math.pow(2, 18 - i) % 11);}return weightingFactor;}

有了加权因子就可以计算校验码了,校验码的生成规则:身份前17位乘以对应的加权因子然后相加,最后的总和再对11取模:

    private static int getMod11CheckCode(String idCard) {//因为weightingFactor返回的结果是固定的,所以也可以写死,这里只是为了解释这个数组是怎么生成的
//      int[] coefficients = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};int[] coefficients = weightingFactor();int sum = 0;for (int i = 0; i < 17; i++) {sum += (idCard.charAt(i) - '0') * coefficients[i];}int checkCode = sum % 11;return checkCode;}

最后我们准备一个数组存的是身份证号最后一位数字:static char[] checkCodes = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

这样checkCodes[getMod11CheckCode("需要校验的身份号")]如果得到的数字与身份证最后一位是相等的,那么就是校验通过了

PS:现在各大AI模型相继问世了,有的支持图片识别,大家可以用上面那个图片试试

上面的校验规则在hutool工具包里面已经有现成的方法可以直接验证身份证号最后一位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/233358.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自学MySql(一)

1.安装下载 下载网址 2、将mysql的bin目录添加到环境变量&#xff08;可选&#xff09; 3、使用一下命令测试

python爬虫AES案例:某招聘网站

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vc2VhcmNoLz9xdWVyeT1weXRob24mdHlwZT0w’) 拿到网址…

【虚拟机】Docker基础 【二】

2.2.数据卷 容器是隔离环境&#xff0c;容器内程序的文件、配置、运行时产生的容器都在容器内部&#xff0c;我们要读写容器内的文件非常不方便。大家思考几个问题&#xff1a; 如果要升级MySQL版本&#xff0c;需要销毁旧容器&#xff0c;那么数据岂不是跟着被销毁了&#x…

Elasticsearch:对时间序列数据流进行降采样(downsampling)

降采样提供了一种通过以降低的粒度存储时间序列数据来减少时间序列数据占用的方法。 指标&#xff08;metrics&#xff09;解决方案收集大量随时间增长的时间序列数据。 随着数据老化&#xff0c;它与系统当前状态的相关性越来越小。 降采样过程将固定时间间隔内的文档汇总为单…

MATLAB中imbothat函数用法

目录 语法 说明 示例 使用底帽和顶帽滤波增强对比度 imbothat函数的功能是对图像进行底帽滤波。 语法 J imbothat(I,SE) J imbothat(I,nhood) 说明 J imbothat(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学底帽滤波。底帽滤波计算图像的形态学闭运算&#…

idea类和方法模版

类模版 修改目标位置 class #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")/*** ${Description}* author whc ${YEAR}/${MONTH}/${DAY}* version v1.0 */public class ${NAME} { }inte…

员工流动是机密泄露的大门?迅软DSE带您重新上锁!

对于员工离职行为管控是经常被忽视的内部威胁的一个来源&#xff0c;现在超过四分之一的员工在离职时窃取数据。无论他们这样做是出于疏忽还是恶意&#xff0c;这种情况只会对企业产生负面影响&#xff0c;包括失去竞争优势、因不遵守网络安全要求而受到处罚等。 数据盗窃的危险…

使用影刀指令+python实现简单的长文本乱序加密

本文意在利用影刀指令python代码&#xff0c;实现一种较为简单的长文本加密和解密&#xff0c;流程结构分为两步&#xff1a; 加密原理–是把字符转为列表&#xff0c;利用列表random模块中的shuffle函数做随机乱序。解密原理–是利用了列表的索引追踪&#xff0c;先前创建字典…

如何运用智能安全帽、执法记录仪等技术手段提高隧道施工人员定位和安全监管效率?

应用需求 隧道中通常没有4G网络&#xff0c;无法搜到GPS卫星&#xff0c; 而领导从安全生产监管的角度&#xff0c;又需要看到现场的视频、录像、人员定位等。这正是本方案需要解决的问题。 系统特点 在无网络的隧道内部录像&#xff0c;紧急情况可派人出隧道&#xff0c;把…

【精选】Spring框架介绍及Spirng各个版本的特性

Spring框架介绍 Spring框架英文全称Spring Framework&#xff0c;是由Spring团队研发的模块化、轻量级开源框架。其主要目的是为了简化项目开发。在项目开发中&#xff0c;可以说没有刻意使用Spring&#xff0c;却处处有着Spring存在。用官网对Spring框架的介绍&#xff1a;Sp…

深度学习——激活函数汇总

深度学习——激活函数汇总 一、ReLU 一、ReLU 参考资料&#xff1a; https://zhuanlan.zhihu.com/p/428448728

NX二次开发UF_CURVE_create_bridge_feature 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_bridge_feature Defined in: uf_curve.h int UF_CURVE_create_bridge_feature(UF_CURVE_bridge_data_p_t bridge_data, tag_p_t bridge_feature ) overview 概述 …