身份证号码含义及最后一位校验算法(ISO 7064:1983.MOD 11-2)

身份证的各位数字代表的含义

1、前1、2位数字表示:所在省份的代码;

2、第3、4位数字表示:所在城市的代码;

3、第5、6位数字表示:所在区县的代码;

4、第7~14位数字表示:出生年、月、日;

5、第15、16位数字表示:所在地的派出所的代码;

6、第17位数字表示性别:奇数表示男性,偶数表示女性;

7、第18位数字是校检码:根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的校验码。


ISO 7064:1983.MOD11-2校验码计算法 : (身份证校验码-第18位)

假设身份证号的前17位数字是:52052020200520999

前17位数字52052020201314999
加权因子7910584216379105842

计算身份证号前17位各个数字与对应加权因子乘积的和:

S = 5×7+2×9+0×10+5×5+2×8+0×4+2×2+0×1+2×6+0×3+0×7+5×9+2×10+0×5+9×8+9×4+9×2
   = 301

计算S÷11的余数:301 ÷ 11=27…余4;

根据下面的校验码表找到对应的校验码,即为身份证号最后一位数字。

余数012345678910
对应校验码10X98765432

余数4对应的校验码为8,所以该身份证号最终为:520520202005209998

校验码计算(Python 代码)

附上Python计算代码~

import math
check_code=[1,0,'X',9,8,7,6,5,4,3,2] # 余数对应的校验码
factor=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] # 身份证号对应的前17位加权因子
c_id="52052020200520999" #身份证号前17位
sum=0
for i in range(len(c_id)):
    sum=sum+int(c_id[i])*factor[i] # 身份证号每一位与对应加权因子相乘并求和
print(sum)
remainder=divmod(sum,11)[1] # 所得和对11取余数
print("The last number is",check_code[remainder],'^_^')

运行结果:

301
The last number is 8 ^_^



Reference
  1. “一个宿舍四款身份证”上热搜 网友:原来不是全国统一
  2. 身份证最后一位校验算法(ISO 7064:1983.MOD 11-2)
  3. 18位身份证号最后一位(检验码)是怎么算出来的?
  4. python中mod函数用法_python divmod函数是如何使用的?
  5. 如果函数返回一个二元组,如何只接收其中的第二个元素?
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值