• 身份证号的计算规则是怎样,如何校验一个身份证号是合法的?


    我们要做校验身份证是否合法,首先要知道身份证号的组成规则,下面我们就来说说这个身份证号:

    大家都应该知道我们身份号有两种,一种是15位数的身份证号 另一种是18位身份证号

    15位:6位常住户口所在县(市、旗、区)的行政区划代码(xxyyzz),6位出生年月日(901212),最后三位称为顺序码,是对前12位编号相同的人编定的顺序号,其中奇数分配给男性,偶数分配给女性。

    18位:6位常住户口所在县(市、旗、区)的行政区划代码(xxyyzz),8位出生年月日(19901212),接下来三位称为顺序码,是对前14位编号相同的人编定的顺序号,其中奇数分配给男性,偶数分配给女性。前面17位身份证编码统称为本体码,是直接由本人的个人信息决定的,而最后一位号码叫做校验码,其是根据校验公式,由本体码决定,用来验证录入或转录过程的准确性。

    15位数没什么好说的,主要是18位最后一位怎么来的,为什么会有X出现?

    算法:先对其他17个乘积求和,然后除以11得到余数,再用1或者12减去这个余数即可得到校验码

    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或者12减去这个余数即可得到校验码,其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。

    5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是12-3=9。如果对应的数字是10,身份证的最后一位号码就是罗马数字X。

    举个例子:

    例如:某男性的身份证号码为【53010219200508011X】, 我们看看这个身份证是不是合法的身份证或者说校验计算下最后一位校验码是否为X?

    首先我们得出前17位的乘积和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然后用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是12-2=10即为X。所以,可以判定这是一个正确的身份证号码。

    另外:好奇心比较强的朋友可能会有疑问,对于算法实现的具体实现的第一步前17位对应系数为什么是7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2,是规定的嘛?其实并不然,本人其实最初了解这个时候也有这样的疑问,事实上这个系数或者叫加权因子都是一定的计算规则来的,下面给大家也解释下。

    身份证号码位置i: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 

    加权因子的公式是:2的18-i次幂除以11取余数,这个值即为加权因子值

    第一位:2的(18-1)次幂=131072%11=7

    第二位:2的(18-2)次幂=65536%11=9

    ...

    第十七为:2的(18-17)次幂=2%11=2

    如此计算即可得到前十七位对应的加权因子数分别为7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2

    身份证校验码规则你懂了吗?有了这些计算规则,你想通过程序进行校验当前身份证号是否合法是不是就没那么复杂了?

  • 相关阅读:
    Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js
  • 原文地址:https://www.cnblogs.com/become/p/8566198.html
Copyright © 2020-2023  润新知