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大战的更多相关文章

  1. 【Java技术系列】爱情36技之暗送秋波的技术

    1. 这篇文章想分享已经很久了,苦于皱巴巴的技术比较生涩难懂,迟迟没有找到好的分享方式,今天结合爱情中暗送秋波的故事的形式,尝试分享一下. 以后如果再有人问你们:能否在加载类的时候,对字节码进行修改? ...

  2. 【Java技术系列】爱情36技之追美妹的技术

    1. 在古老的非洲大陆上,有个原始人无意中抬头仰望星空,凝视的时间稍微长了一些,超过了外星人设置的阈值,立刻拉响了人类即将产生文明的警报.因为外星人认为,人类已经产生了对宇宙的好奇心,文明的产生,科技 ...

  3. 【Java技术系列】爱情36技之记忆永存

    1.  关注“一猿小讲”的伙伴们都清楚,Java 那小子带着心爱的 Python 菇凉,去了一趟浪漫的土耳其,然后一起又去了东京和巴黎,接着 Python 菇凉自己又去了云南的大理. 就在昨天,Pyt ...

  4. Java基础系列(36)- 数组三种初始化及内存分析

    内存分析 数组三种初始化 静态初始化 int[] a = {1,2,3}; Man[] mans = {new Man(1,1),new Man(2,2)} 动态初始化 int[] a = new i ...

  5. 1.Java 加解密技术系列之 BASE64

    Java 加解密技术系列之 BASE64 序号 背景 正文 总结 序 这段时间,工作中 用到了 Java 的加解密技术,本着学习的态度,打算从这篇文章开始,详细的研究一番 Java 在加解密技术上有什 ...

  6. Java 加解密技术系列文章

    Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...

  7. Tomcat系列之Java技术详解

    一.概述 1.前言 在前面几篇博客中,我们和大家说了负载均衡器服务器.Web服务器.反向代理服务器.缓存服务器,从这篇博客开始我们和大家说说应用程序服务器,对于上述内容不了解的博友可以去参考一下我们前 ...

  8. 11.Java 加解密技术系列之 总结

    Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...

  9. 10.Java 加解密技术系列之 DH

    Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...

随机推荐

  1. "长辈牌"电子产品:有一种评论朋友圈叫给你打电话

    一.长辈们使用电子产品的姿势集合 先问你一个问题:「怎么下载搜狗输入法?」 (非广告) 摁?看到这篇文章的你可能都有点懵,不就下载安装就完了吗?但是,真的就只是这样吗? 前一段时间,当家里的长辈问到我 ...

  2. MATLAB神经网络(4) 神经网络遗传算法函数极值寻优——非线性函数极值寻优

    4.1 案例背景 \[y = {x_1}^2 + {x_2}^2\] 4.2 模型建立 神经网络训练拟合根据寻优函数的特点构建合适的BP神经网络,用非线性函数的输入输出数据训练BP神经网络,训练后的B ...

  3. js实现字符串逆向输出的4种方式

    一.第一种方式(利用charAt()这个函数实现) 代码如下: var str="你好世界!!!!"; var str1="";//这里创建一个空字符串用来拼接 ...

  4. Python模块二

    os模块是与操作系统交互的一个接口​ <em>#和文件夹相关 os.makedirs('dirname1/dirname2')    可生成多层递归目录 os.removedirs('di ...

  5. MongoDB TTL索引的使用

    目录 一.TTL索引介绍 二.TTL索引运行逻辑 三.TTL索引的限制 四.TTL索引的使用场景 1. 指定具体的过期时间属性 2. 插入一个具体的过期时间 3. TTL属性的修改(collMod) ...

  6. vue组件通信(props,$emit,$attrs,$listeners)

    朝颜陌   vue基础----组件通信(props,$emit,$attrs,$listeners) 一.父传子,子传孙 1. props 1>在父组件中通过子组件自定义的标签属性来传递数据. ...

  7. node 微信支付

    基于node 实现微信支付功能 需要了解的网站:微信支付 流程图: 1. 1.我的路由: const Koa = require('koa') const app = new Koa() const ...

  8. 免费开源的 HelloDjango 系列教程,结束还是开始?

    作者:HelloGitHub-追梦人物 我们已经成功地开发了一个功能比较完备的个人博客,是时候来总结一下我们的工作了.博客系列完整的源代码地址: https://github.com/HelloGit ...

  9. Java 内存模型都不会,就敢在简历上写熟悉并发编程吗

    从 PC 内存架构到 Java 内存模型 你知道 Java 内存模型 JMM 吗?那你知道它的三大特性吗? Java 是如何解决指令重排问题的? 既然CPU有缓存一致性协议(MESI),为什么 JMM ...

  10. Windows主机与centOS虚拟机之间"ping不通"

    为什么要遇到这个问题 这是我重新安装centOS7.5虚拟机之后遇到的问题——我需要安装一个SecureCRT工具,结果主机与虚拟机没有ping通. 在安装这个工具之前需要进行主机与虚拟机的相互pin ...