校验身份证_利用Python的基本运算校验身份证真伪

年关将至,也到了该买票回家的日子,坐在火车上想着家里的亲人,久违的饭菜,想必是一件很甜蜜的事情。科技的进步以及逐步开始推广的无纸票制度使得我们现在买票越来越方便,而说到买票就不得不提到一个非常重要的私人物品:身份证。

从1999年10月1日开始,国家推广了我们一直到现在都在沿用的18位身份证号码,前六位为所在省市区编号,中间八位为个人的出生日期,15-17位为顺序码,最后一位为校验码。不知道大家有没有注意到一个小细节,那就是有少数人的最后一位是‘X’,这个‘X’意味着什么呢?有人说,最后一位其实是性别,男性为单数,女性为双数,而出生时第一时间不能判断性别的,会用‘X’代替。哈哈,这是一个笑谈,大部分人的身份证办理都是在成年以后,怎么会出现判断不了性别的情况呢,既然不是,那我们就来研究一下,这个‘X’的故事。

7bed334768e96a656b1aa6c6808983c0.png

首先,身份证上出现的‘X’并不是字母X,而是古罗马数字X,也就是数字10,这要从身份证最后一位的计算方式说起了,身份证的最后一位其实是由号码编制单位按统一的公式通过前面的17位计算得来的,是一种用于监测身份证真伪的校验码,通过这种计算方式,一共可以得到11种结果,既0-10,当计算结果为0-9时,可以直接放在身份证上,而一旦计算结果为10,如果直接放在末尾,身份证的位数就变成了19位,这是不符合我国身份证规范的,所以,为了防止多一位,出现结果为10就用罗马数字‘X’代替(类似于现在的苹果X,就代表苹果十代一样)。身份证上出现‘X’,仅仅是以为他的校验码结果为10,与其他身份证并没有什么区别。

这套身份证校验码的计算方式,被称为ISO 7064:1983.MOD 11-2校验码计算,名字听起来可是很高大上,但实际计算方式并不难,我们来看一下它的计算过程:

  • 取身份证的前17位,分别乘以不同的系数。17位对应系数分别为7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2。
  • 两两相乘后,所得结果相加,得到一个总数。
  • 使用得到的总数取余11,得到一个0-10的结果。
  • 以此结果为下标,在列表[1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]中获取对应的值,这个值就是身份证的最后一位校验码。

通过这种计算方式,我们可以使用短短10行的代码来实现计算身份证最后一位的功能。

id_card = input('输入身份证前17位:')if len(id_card) != 17:    print('输入长度不符!')    exit()pass_mi  = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]sum = 0for i,mi in enumerate(pass_mi):    sum += mi*int(id_card[i])   md_num = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]print('身份证最后一位 :', md_num[sum%11])

经过几次身份证号码的实验,发现此计算方式所得结果是正确的!感兴趣的同学可以试一下。如果出现结果不符,那可是要注意一下身份证的真伪了(误)~

顺便再说个关于身份证的小常识,虽然在文章前面提到过使用最后一位判断性别是玩笑话,但是身份证确实可以用来判断性别,只不过不是最后一位而是倒数第二位,双数为女性,单数为男性。

296159f090236ef36ea9e20e77c51825.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值