当前位置: 首页 > 编程日记 > 正文

【Java】身份证号码验证

代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547

  1 package xxx;
  2 
  3 /**
  4  * Created by wdj on 2017/6/21.
  5  */
  6 
  7 import java.text.ParseException;
  8 import java.text.SimpleDateFormat;
  9 import java.util.Calendar;
 10 import java.util.Date;
 11 import java.util.Random;
 12 
 13 /**
 14  * 身份证验证的工具(支持15位或18位省份证)
 15  * 身份证号码结构:
 16  * <p>
 17  * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
 18  * 排列顺序从左至右依次为:6位数字地址码,8位数字出生日期码,3位数字顺序码和1位数字校验码。
 19  * <p>
 20  * 地址码(前6位):表示对象常住户口所在县(市、镇、区)的行政区划代码,按GB/T2260的规定执行。
 21  * <li>前1、2位数字表示:所在省份的代码;</li>
 22  * <li>第3、4位数字表示:所在城市的代码;</li>
 23  * <li>第5、6位数字表示:所在区县的代码;</li>
 24  * <p>
 25  * 出生日期码,(第7位 - 14位):表示编码对象出生年、月、日,按GB按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
 26  * <p>
 27  * 顺序码(第15位至17位):表示在同一地址码所标示的区域范围内,对同年、同月、同日出生的人编订的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
 28  * <li>第15、16位数字表示:所在地的派出所的代码;</li>
 29  * <li>第17位数字表示性别:奇数表示男性,偶数表示女性;</li>
 30  * <li>第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。</li>
 31  * <p>
 32  * 校验码(第18位数):
 33  * <p>
 34  * 十七位数字本体码加权求和公式 s = sum(Ai*Wi), i = 0..16,先对前17位数字的权求和;
 35  * Ai:表示第i位置上的身份证号码数字值.Wi:表示第i位置上的加权因子.Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2;
 36  * 计算模 Y = mod(S, 11)
 37  * 通过模得到对应的模 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2
 38  * <p>
 39  * 计算步骤:
 40  * 1.将前17位数分别乘以不同的系数。从第1位到第17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
 41  * 2.将这17位数字和系数相乘的结果相加。
 42  * 3.用加出来和除以11,看余数是多少
 43  * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字,分别对应的最后一位身份证的号码为:1 0 X 9 8 7 6 5 4 3 2
 44  * <p>
 45  */
 46 public class IDCardUtil
 47 {
 48     /**
 49      * <pre>
 50      * 省、直辖市代码表:
 51      *     11 : 北京  12 : 天津  13 : 河北   14 : 山西  15 : 内蒙古
 52      *     21 : 辽宁  22 : 吉林  23 : 黑龙江 31 : 上海  32 : 江苏
 53      *     33 : 浙江  34 : 安徽  35 : 福建   36 : 江西  37 : 山东
 54      *     41 : 河南  42 : 湖北  43 : 湖南   44 : 广东  45 : 广西  46 : 海南
 55      *     50 : 重庆  51 : 四川  52 : 贵州   53 : 云南  54 : 西藏
 56      *     61 : 陕西  62 : 甘肃  63 : 青海   64 : 宁夏  65 : 新疆
 57      *     71 : 台湾
 58      *     81 : 香港  82 : 澳门
 59      *     91 : 国外
 60      * </pre>
 61      */
 62     final static String CITY_CODE[] = {"11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91"};
 63 
 64     /**
 65      * 效验码
 66      */
 67     final static char[] PARITYBIT = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
 68 
 69     /**
 70      * 加权因子
 71      * Math.pow(2,  i - 1) % 11
 72      */
 73     final static int[] POWER = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
 74 
 75     /**
 76      * 身份证验证
 77      *
 78      * @param id 号码内容
 79      * @return 是否有效
 80      */
 81     public final static boolean isValid(String id)
 82     {
 83         if (id == null)
 84             return false;
 85 
 86         int len = id.length();
 87         if (len != 15 && len != 18)
 88             return false;
 89 
 90         //校验区位码
 91         if (!validCityCode(id.substring(0, 2)))
 92             return false;
 93 
 94         //校验生日
 95         if (!validDate(id))
 96             return false;
 97 
 98         if (len == 15)
 99             return true;
100 
101         //校验位数
102         return validParityBit(id);
103 
104     }
105 
106     private static boolean validParityBit(String id)
107     {
108         char[] cs = id.toUpperCase().toCharArray();
109         int power = 0;
110         for (int i = 0; i < cs.length; i++)
111         {
112             //最后一位可以是X
113             if (i == cs.length - 1 && cs[i] == 'X')
114                 break;
115 
116             // 非数字
117             if (cs[i] < '0' || cs[i] > '9')
118                 return false;
119 
120             // 加权求和
121             if (i < cs.length - 1)
122             {
123                 power += (cs[i] - '0') * POWER[i];
124             }
125         }
126         return PARITYBIT[power % 11] == cs[cs.length - 1];
127     }
128 
129     private static boolean validDate(String id)
130     {
131         try
132         {
133             String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);
134             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
135             Date birthDate = sdf.parse(birth);
136             if (!birth.equals(sdf.format(birthDate)))
137                 return false;
138         }
139         catch (ParseException e)
140         {
141             return false;
142         }
143         return true;
144     }
145 
146     private static boolean validCityCode(String cityCode)
147     {
148         for (String code : CITY_CODE)
149         {
150             if (code.equals(cityCode))
151                 return true;
152         }
153         return false;
154     }
155 
156     /**
157      * 将15位的身份证转成18位身份证
158      *
159      * @param id
160      * @return
161      */
162     final public static String id15To18(String id)
163     {
164         if (id == null || id.length() != 15)
165             return null;
166 
167         if (!isValid(id))
168             return null;
169 
170         String id17 = id.substring(0, 6) + "19" + id.substring(6);
171 
172         int power = 0;
173         char[] cs = id17.toCharArray();
174         for (int i = 0; i < cs.length; i++)
175         {
176             power += (cs[i] - '0') * POWER[i];
177         }
178 
179         // 将前17位与第18位校验码拼接
180         return id17 + String.valueOf(PARITYBIT[power % 11]);
181     }
182 
183     /**
184      * 生成随机整数
185      * <p>
186      *
187      * @param min
188      * @param max
189      * @return
190      */
191     public static int rand(int min, int max)
192     {
193         Random random = new Random();
194         return random.nextInt(max + 1) % (max - min + 1) + min;
195     }
196 
197     public final static String generateID()
198     {
199         // 地址码
200         String body = CITY_CODE[rand(0, CITY_CODE.length - 1)] + "0101";
201 
202         // 出生年
203         String y = String.valueOf(rand(1950, Calendar.getInstance().get(Calendar.YEAR)));
204         String m = String.valueOf(rand(1, 12));
205         if (m.length() == 1)
206             m = "0" + m;
207         String d = String.valueOf(rand(1, 28));
208         if (d.length() == 1)
209             d = "0" + d;
210 
211         String idx = String.valueOf(rand(1, 999));
212         if (idx.length() == 1)
213             idx = "00" + idx;
214         else if (idx.length() == 2)
215             idx = "0" + idx;
216 
217         body += y + m + d + idx;
218 
219         // 累加body部分与位置加权的积
220         int power = 0;
221         char[] cs = body.toCharArray();
222         for (int i = 0; i < cs.length; i++)
223         {
224             power += (cs[i] - '0') * POWER[i];
225         }
226 
227         // 得出校验码
228 
229         return body + String.valueOf(PARITYBIT[power % 11]);
230     }
231 }

转载于:https://www.cnblogs.com/utank/p/7279851.html

相关文章:

linux history记录格式修改

#保存一万条命令记录 sed -i s/^HISTSIZE1000/HISTSIZE10000/g /etc/profile#在/etc/profile的文件尾部添加如下行数配置信息 ######jiagu history xianshi######### USER_IPwho -u am i 2>/dev/null | awk {print $NF} | sed -e s/[()]//g if [ "$USER_IP" &quo…

从EAI到SOA

写在前面SOA现在越发闹腾的厉害了&#xff0c;各种宣传越来越多&#xff0c;都把SOA吹上天&#xff1b;到底SOA是什么&#xff0c;有啥神奇之处&#xff0c;真的想宣传说的那么好吗&#xff1f;看了种种文章&#xff0c;只是越发混沌。罢了&#xff0c;俺做技术的&#xff0c;商…

用C#实现FTP搜索引擎

晚辈最近用C#写了一个教育网FTP搜索引擎&#xff0c;希望能得到高手的指点。 网址&#xff1a;http://soso.ccnu.com.cn http://it.ccnu.edu.cn/soso 部分代码&#xff1a; using System;using softplib;using System.Threading;using System.Collections;using System.Ne…

IDEA配置GitHub和Gitee

IDEA配置GitHub和GiteeIDEA配置GitHub和GiteeGit准备IDEA内配置Git配置GitHub1. IDEA的Settings-->Version Control ---> GitHub2. 登录账户GitHub Invalid authentication data.404 Not Found-Not Found报错及解决办法2.1 登录自己的github账号--》头像---》settting2.2…

MATLAB 2014a (8.3) Compiler Runtime (MCR)

在安装的时候可以 ./install -H 界面化安装到自己目录下 MATLAB 2014a (8.3) Runtime Compiler (MCR) Errors when trying to launch deployed (using deploy tool) application in Ubuntu 13.04. Right after installation of MCR if one runs the deployed application follo…

[Quiz]竞赛题目 Word Trace

一、竞赛题目Problem Statement You are given a String[] grid representing a rectangular grid of letters. You are also given a String find, a word you are to find within the grid. The starting point may be anywhere in the grid. The path may move up, down, le…

c#总结最近的几项重要代码

java的代码就不说了&#xff0c;毕竟不是我的主业。 1.c#数据库连接池Hikari. (1)动态加载各类数据库驱动 &#xff08;2&#xff09;支持简单配置文件 &#xff08;3&#xff09;支持按照名称多数据库调用 &#xff08;4&#xff09;使用简洁 单数据库使用&#xff1a; Hikari…

动态模板列更新数据分页的例子

前台&#xff1a;<% Page language"c#" Codebehind"WebForm30.aspx.cs" AutoEventWireup"false" Inherits"csdn.WebForm30" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML>…

[您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...

这一次&#xff0c;我们来了解普通Trie树的变种&#xff1a;0-1Trie以及在其基础上产生的可持久化Trie&#xff08;其实&#xff0c;普通的Trie也可以可持久化&#xff0c;只是不太常见&#xff09; 先简单介绍一下0-1Trie&#xff1a;一个0-1Trie节点只有两个子节点&#xff0…

SQL查询1064报错 [ERR] 1064 - You have an error in your SQL syntax; check the manual.......

MySQL建表出现1064问题问题 SQL语句 DROP DATABASE IF EXISTS bookstore; DROP DATABASE bookstore; USE bookstore; CREATE TABLE t_user (id INT PRIMARY KEY auto_increment,username VARCHAR ( 20 ) NOT NULL UNIQUE,password VARCHAR ( 32 ) NOT NULL,email VARCHAR ( …

移动端丨-webkit-overflow-scrolling:touch属性导致页面卡住

起因 起因-webkit-overflow-scrolling问题解决方案&#xff1a; 方案一方案二思考为什么会出现这个问题总结故事的起因是&#xff0c;在一个多列表的页面上&#xff0c;页面在iOS11&#xff0c;跟iOS10中会发生页面卡住&#xff0c;不能进行滚动。 然后就怀疑是自己的样式写的出…

瑞星杀毒软件所有监控已禁用!

瑞星杀毒软件所有监控已禁用! 我的瑞星杀毒软件所有监控已禁用!在右下脚有个红色的小伞,可以升级,但是监控怎么都开启不了。 解决办法是&#xff1a;启动主程序&#xff0c;点“工具列表”&#xff0c;选择“瑞星监控中心”&#xff0c;点“运行”&#xff0c;在弹出的窗口…

Typora输出表情 Typora_Smile

文章目录小表情还挺好看的SmileNatureObjectsPlacesSymbols小表情还挺好看的 Smile &#x1f604; :smile:&#x1f606; :laughing:&#x1f60a; :blush:&#x1f603; :smiley:☺️ :relaxed:&#x1f60f; :smirk:&#x1f60d; :heart_eyes:&#x1f618; :kissing_hear…

COOKIE操作

import scrapyclass CookiedemoSpider(scrapy.Spider):name cookiedemo# allowed_domains [www.douban.com]start_urls [https://www.douban.com/accounts/login/]def parse(self, response):# 登录成功后对页面数据进行存储fp open("main.html", "w",…

01--安装Activiti流程设计器eclipse插件

Activiti1 安装流程设计器eclipse插件   Name:Activiti BPMN 2.0 designer&#xff08;随便起个名字&#xff09;   Location: http://activiti.org/designer/update/ 安装完成后勾选(不勾选不生成bpmn文件) 转载于:https://www.cnblogs.com/miye/p/7283468.html

许美静《盖被》

空白时光有你来填满可以是平静或灿烂有时浓有时淡心胸要宽广才能够经得起波浪在旅途中风起和云涌每个人都会有起落有时浮有时沉有时没方向有时在雾里向前闯一生中难免常会有不如意道路太平坦会失去了勇气就(让)算天塌下来把它当被盖我只想好好过现在日子太贫乏会失去了意义万里…

SBO顾问的收入

SAP顾问的收入&#xff0c;在很多文章都有专门记载了&#xff0c;有些人比我更熟悉。差别也是比较大&#xff0c;在我熟悉的行业SAP business one产品中&#xff0c;我给大家说说我所知道的sbo顾问的收入&#xff0c;给希望入这个行业的人或感兴趣的人一点小小的提示。总体来说…

带无线网卡的电脑开启热点

带无线网卡的电脑开启热点 文章目录带无线网卡的电脑开启热点准备&#xff1a;共享WiFi的建立建立Bat批处理文件准备&#xff1a; 无线网卡 大部分笔记本自带或USB无线网卡 验证你的无线网卡是否支持承载网络 按winR调出命令行&#xff0c;输入命令netsh wlan show drivers在…

BZOJ2275[Coci2010]HRPA——斐波那契博弈

题目描述 N个石子&#xff0c;A和B轮流取&#xff0c;A先。每个人每次最少取一个&#xff0c;最多不超过上一个人的个数的2倍。取到最后一个石子的人胜出&#xff0c;如果A要有必胜策略&#xff0c;第一次他至少要取多少个。 输入 第一行给出数字N&#xff0c;N<10^15.第二行…

MonoRail学习笔记一:一个小例子

随着微软放出消息&#xff0c;准备发布MVC的框架&#xff0c;各种议论纷至沓来。以前用java、jsp对它的MVC结构、集中控制印象特别深刻&#xff0c;自从用了.NET后&#xff0c;虽然webform的控件很好用&#xff0c;总感觉有点怪怪的在网上搜了一下&#xff0c;发现早就有了Mono…

一个总裁做企业的十条心得

经常面对很多企业老总&#xff0c;但能够促膝谈心的不多&#xff0c;原因是大家忙&#xff0c;忙得没时间想一些事情。在我采访的一个老总中&#xff0c;他给了我十句话&#xff0c;我铭刻在心&#xff0c;兹整理出来&#xff0c;共同分享。鉴于不便透露姓名&#xff0c;希望有…

BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

n<100000个数表示每头牛在K<30种物品的选取情况&#xff0c;该数在二进制下某位为0表示不选1表示选&#xff0c;求一个最大的区间使区间内选择每种物品的牛一样多。 数学转化&#xff0c;把不同状态间单变量的关系通过不等式移项转变为单状态的多变量关系。 sum[i,j]表示…

AttributeError: Cant get attribute SPPF on module models

运行YOLOV5出现报错AttributeError: Cant get attribute SPPF 问题 AttributeError: Cant get attribute SPPF 运行yolov5下面Tags5的代码出现问题&#xff1a; AttributeError: Cant get attribute SPPF on module models 搞了很久&#xff0c;最终得到解决方案&#xff0…

Compiere去掉启动时的下面显示的进度条

package org.compiere.apps;public class AMenuStartItem extends Thread implements ActionListener{*****************public void run(){*********************//SwingUtilities.invokeLater(m_resetPB);********************//SwingUtilities.invokeLater(m_updatePB);}}

redis命令大全

一、key pattern 查询相应的key &#xff08;1&#xff09;Redis允许模糊查询key 有3个通配符 *、?、[] &#xff08;2&#xff09;randomkey&#xff1a;返回随机key &#xff08;3&#xff09;type key&#xff1a;返回key存储的类型 &#xff08;4&#xff09;exis…

批量下载文献中的参考文献

批量下载文献中的参考文献 这里写目录标题批量下载文献中的参考文献一级目录二级目录三级目录一、下载所有你需要文献的引文题录二、导入到文献管理软件中**点击导入文献&#xff0c;上一步已经下载的&#xff0c;如果不会EndNote导入题录的话也可以直接拖进去或者百度咯****导…

python Django 学习笔记

* python版本和Django对应的关系&#xff1a; * Django2.0系列之后&#xff0c;不支持python2.x系列 * 安装&#xff1a; pycharm直接可以搜索安装&#xff0c;可以省略手工安装的麻烦 需要手动安装&#xff1a;pip install django * 转载于:https://www.cnblogs.com/chenadong…

reporting Server組件不全引起的致命錯誤

在做專案的時候&#xff0c;前几天release一個windows的版本可以工作得很好&#xff0c;但今天release出去的卻出現在致命錯誤&#xff0c;根本無法啟動,從事件管理器中把錯誤信息摘出如下&#xff1a;事件類型: 錯誤 事件來源: .NET Runtime 2.0 Error Reporting 事件類別目錄…

祝大家端午节快乐

今天是农历五月五日&#xff0c;端午节&#xff0c;祝大家节日快乐&#xff01;吃粽子啦&#xff01;&#xff01;

shell脚本中判断上一个命令是否执行成功

2018-12-21 shell中使用符号“$?”来显示上一条命令执行的返回值&#xff0c;如果为0则代表执行成功&#xff0c;其他表示失败。结合if-else语句实现判断上一个命令是否执行成功 示例如下&#xff1a; if [ $? -ne 0 ]; thenecho "failed" elseecho "succeed&…