【Java技术系列】爱情36技之Bug大战
1.
鲁迅先生说:程序员,天不怕地不怕,就怕小虫儿爬呀爬,爬呀爬。
随着时间的推移,鲁迅先生又说:真正勇猛的程序员,敢于让虫子面对惨淡的虫生。
虫子在程序员心中是啥东西?虫子的学名为 Bug,是多少入了猿门的程序员,心中不愿提及的痛。消灭虫子的技能为 Debug,这项技能我敢保证:无论你是小白、大牛还是骨灰级的程序员,多多少少都需要进行修炼。
千年虫又是啥东东?计算机 2000 年问题,又叫做“千年虫”、“电脑千禧年千年虫问题”或“千年危机”。缩写为“Y2K”。是指在某些使用了计算机程序的智能系统(包括计算机系统、自动控制芯片等)中,由于其中的年份只使用两位十进制数来表示,因此当系统进行(或涉及到)跨世纪的日期处理运算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃。因此从根本上说千年虫是一种程序处理日期上的 bug(计算机程序故障)——摘自百度百科。
看完官方的回答,那我们能否用人话再解释一下“千年虫”?其实大概意思是这样的:由于之前计算机内存比较小,时间只用 2 位数来进行表示“年”,例如 1998 年就表示成 98。但是到了 2000 年,机器上出现的时间就是 00 年,而电脑就不能识别,这个是公元 1900 年,还是公元 2000 年。就好比你在 1999 年 12 月 31 日 23:59 分打了三分钟的电话,电话局的账单却可能显示为 (-100年+3分钟),这就是所谓的“千年虫的问题”。
好了,准备好小板凳,今天的故事就从虫子(Bug)说起。
2.
前些天,Python 菇凉跟着 Java 那小子,学会了安装、破解 IDEA,并熟练用 IDEA 编写 HelloWorld 入门程序。为了庆祝 Python 菇凉的顺利步入猿门,Java 那小子带着 Python 菇凉来到了著名而又浪漫的 C++C-- 游乐场。
C++C-- 游乐场确实名气很大,购买入场票的队伍,像闹市里的车水马龙一样挤得满满的。
时间过去了两个小时,终于轮到了 Java 那小子 & Python 菇凉。Java 那小子把身份证递给售票员 Node.js 小姐姐。
售票员 Node.js 小姐姐说:Python 菇凉你的身份证号为 15 位,购票系统提示“身份证号位数不足 18 位”,麻烦请提供 18 位的身份证号。
Java 那小子心中有点浴火,不过这也不能怪 Node.js 小姐姐,只能说他们的系统不支持自动把 15 位身份证号自行变为 18 位身份证号,场面很尴尬,那需要赶紧想个招来。
在猿门摸爬滚打久了的 Java 那小子,无论去哪儿都会随身携带电脑,以防不测。说时迟那时快,只见 Java 那小子已经打开笔记本电脑,猛如虎的请教度娘 & 谷哥,关于身份证规则的前世今生。
早期身份证由 15 位数字构成,这主要是在 1980 年以前发放的身份证,其中编排规则如下。
前 1、2 位数字表示:所在省份的代码;
第 3、4 位数字表示:所在城市的代码;
第 5、6 位数字表示:所在区县的代码;
第 7~12 位数字表示:两位年、月、日(yyMMdd);
第 15 位数字表示性别:奇数表示男性,偶数表示女性。
聪明的你肯定也会发现 15 位的身份证号,只能为 1900 年 1 月 1 日到 1999 年 12 月 31 日出生的人编号,如果是 2019 年出生的,按照 15 位身份证规则,应该记为 19 ,但是这个到底代表 1919 还是 2019呢?这明显存在一个千年虫子的问题,考虑到这个 Bug,因而又增加了 18 位身份证号码编号规则。
前 1、2 位数字表示:所在省份的代码;
第 3、4 位数字表示:所在城市的代码;
第 5、6 位数字表示:所在区县的代码;
第 7~14 位数字表示:出生年、月、日(yyyyMMdd);
第 15~17 位数字是顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性(即第17位是奇数代表男性,是偶数代表女性)。
第 18 位数字是校检码:用来检验身份证的正确性。校检码可以是 0~9 的数字,有时也用 X 表示。
15位 vs 18 位身份证号区别在哪里?
15 位身份证号出生年月日为 yyMMdd,而 18 位身份证号格式为yyyyMMdd;
15 位身份证号没有校验码。
我们该如何实现 15位 转成 18 位的身份证号呢?
0、首先将15位的身份证号,加入两位年份变成17位身份证号;
1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和系数相乘的结果相加。
3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...)
4.1、如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字X。
搞定了身份证编排规则后,再来码代码消灭这个千年虫就变得容易了。只见 Java 那小子开启了身份证 15 位转换 18 位的行云流水般的编码操作。
经过 Java 那小子近 2 分钟的猛如虎的实现下,成功实现 Python 菇凉身份证 15 位转换成 18 位,然后把 18 位的证件号码给 Node.js 售票员小姐姐提供了一下,意料之中一次性购票成功。
Java 那小子处于他人考虑,把代码包装成一键运行的工具,分享给 Node.js 售票员小姐姐,希望能解决他人的燃眉之急。
至此,身份证千年虫的问题,被Java 那小子彻底消灭。Java 那小子与心爱的 Python 菇凉正常愉快的进入了 C++C-- 游乐场,开启了美好一天的浪漫玩耍。
3.
故事讲完了,由于身份证编排规则的更新,很多老的系统依然会存在 15 位的身份证号,此时要么从库中,批量更新用户的身份证号;要么进行扩展程序支持。其中无论你是用数据库批量更新;还是用程序跑批,15 位转成 18 位的身份证号的实现思路都是一样的。
好了,今天的分享就到这儿吧,希望对你能有帮助。

【Java技术系列】爱情36技之Bug大战的更多相关文章
- 【Java技术系列】爱情36技之暗送秋波的技术
1. 这篇文章想分享已经很久了,苦于皱巴巴的技术比较生涩难懂,迟迟没有找到好的分享方式,今天结合爱情中暗送秋波的故事的形式,尝试分享一下. 以后如果再有人问你们:能否在加载类的时候,对字节码进行修改? ...
- 【Java技术系列】爱情36技之追美妹的技术
1. 在古老的非洲大陆上,有个原始人无意中抬头仰望星空,凝视的时间稍微长了一些,超过了外星人设置的阈值,立刻拉响了人类即将产生文明的警报.因为外星人认为,人类已经产生了对宇宙的好奇心,文明的产生,科技 ...
- 【Java技术系列】爱情36技之记忆永存
1. 关注“一猿小讲”的伙伴们都清楚,Java 那小子带着心爱的 Python 菇凉,去了一趟浪漫的土耳其,然后一起又去了东京和巴黎,接着 Python 菇凉自己又去了云南的大理. 就在昨天,Pyt ...
- Java基础系列(36)- 数组三种初始化及内存分析
内存分析 数组三种初始化 静态初始化 int[] a = {1,2,3}; Man[] mans = {new Man(1,1),new Man(2,2)} 动态初始化 int[] a = new i ...
- 1.Java 加解密技术系列之 BASE64
Java 加解密技术系列之 BASE64 序号 背景 正文 总结 序 这段时间,工作中 用到了 Java 的加解密技术,本着学习的态度,打算从这篇文章开始,详细的研究一番 Java 在加解密技术上有什 ...
- Java 加解密技术系列文章
Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...
- Tomcat系列之Java技术详解
一.概述 1.前言 在前面几篇博客中,我们和大家说了负载均衡器服务器.Web服务器.反向代理服务器.缓存服务器,从这篇博客开始我们和大家说说应用程序服务器,对于上述内容不了解的博友可以去参考一下我们前 ...
- 11.Java 加解密技术系列之 总结
Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...
- 10.Java 加解密技术系列之 DH
Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...
随机推荐
- 观察者模式(Observer)和发布-订阅者模式(Publish/Subscribe)区别
观察者模式:定义一对多的关系,让多个观察对象同时监听某一个主题对象,主题对象状态发生变化就通知所有观察者对象.所以它是由两类对像组成:Subject主题+Observer观察者.主题发布事件,观察者通 ...
- 2019年高校微信小程序开发大赛学习笔记
学做小程序(学堂在线笔记)一.传统布局 text-align:center //水平居中 margin-bottom: 60px //设置间距 二.弹性盒子布局 display:flex; flex- ...
- 7种你应该知道的JavaScript常见的错误
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/types-of-native-errors-in- ...
- 【原创】(求锤得锤的故事)Redis锁从面试连环炮聊到神仙打架。
这是why技术的第38篇原创文章 又到了一周一次的分享时间啦,老规矩,还是先荒腔走板的聊聊生活. 有上面的图是读大学的时候,一次自行车骑行途中队友抓拍的我的照片.拍照的地方,名字叫做牛背山,一个名字很 ...
- Layui select下拉框改变之 change 监听事件(转)
在layui中使用 jquery 触发select 的 change事件无效 使用layui.use监听select事件 <select lay-filter="demo" ...
- vs2017 dlib19.3 opencv3.41 C++ 环境配置 人脸特征点识别
身为一个.net程序员经过两天的采坑终于把人脸特征检测的项目跑通了,然后本文将以dlib项目中人脸特征检测工程为例,讲解dlib与opencv 在vs2017 C++ 项目中的编译与运行路径配置. 1 ...
- JS实现滚动区域触底事件
效果 贴上效果展示: 实现思路 样式方面不多赘述,滚动区域是给固定高度,设置 overflow-y: auto 来实现. 接下来看看js方面的实现,其实也很简单,触发的条件是: 可视高度 + 滚动距离 ...
- 聊聊OkHttp实现WebSocket细节,包括鉴权和长连接保活及其原理!
一.序 OkHttp 应该算是 Android 中使用最广泛的网络库了,我们通常会利用它来实现 HTTP 请求,但是实际上它还可以支持 WebSocket,并且使用起来还非常的便捷. 那本文就来聊聊, ...
- Android UI性能测试——使用 Gfxinfo 衡量性能
Android官方文档翻译 原文地址:https://developer.android.com/training/testing/performance参考:https://www.jianshu. ...
- vscode如何配置debug,python正则表达式如何匹配括号,关于python如何导入自定义模块
关于vscode如何配置debug的问题: 1.下载安装好python,并且配置好 环境变量 2.https://www.cnblogs.com/asce/p/11600904.html 3.严格按照 ...