@daoxin/card
v0.0.6
Published
一款基于大中华区的身份证规则验证库
Downloads
6
Readme
card
一款基于中国大中华区的身份证规则验证库
一、如何使用
$ npm i @daoxin/card //或 yarn add @daoxin/card
const Card = require('@daoxin/card').default // 获取 import Card from '@daoxin/card'
console.log('身份证no',new Card("513022199509151233").isValid()) //身份证no false
console.log('身份证ok',new Card("513022199509151234").isValid()) //身份证ok true
console.log('身份证ok_info',new Card("173022199509151234",true).isValid()) // 身份证ok_info { valid: false }
console.log('身份证ok_info',new Card("513022199509151234",true).isValid()) //身份证ok_info {valid: true,id: '513022199509151234',length: 18,y: '1995',m: '09',d: '15',sex: '男',province: '四川省'}
console.log('身份证no_info',new Card("513022199519131234",true).isValid()) //身份证no_info { valid: false }
console.log('身份证no_info',new Card("16302219930910123",true).isValid()) //身份证no_info { valid: false }
console.log('身份证no',new Card().isValid()) //身份证no false
二、身份证检验原理
编排规则
身份证号码是由18位数字组成的,它们分别表示:
前1、2位数字表示:所在省份的代码;
第3、4位数字表示:所在城市的代码;
第5、6位数字表示:所在区县的代码;
第7~14位数字表示:出生年(7~10)月(11~12)日(13~14);
第15、16位数字表示:所在地的派出所的代码
第17位数字表示性别:奇数表示男性,偶数表示女性
第18位数字是校检码:校检码可以是
0~9
的数字,有时也用x表示-> 号码的结构: 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
-> 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
-> 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
尾号X的意义
身份证的号码是按照国家标准编制的,由18位组成:前六位为行政区划代码,第七至第十四位为出生日期码,第15至17位为顺序码,第18位为校验码。
作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
身份证号异同
15位的身份证号:
dddddd yymmdd xx p
18位的身份证号:
dddddd yyyymmdd xx p y
其中dddddd为地址码(省地县三级)
18位中的和15位中的不完全相同:
yymmdd yyyymmdd
为出生年月日;xx为顺号类编码;
p为性别;
前17位的ascii码值经位移、异或运算,结果不在0-9的令其为x。
18位号码中末尾的y为校验码,可参考算法(身份证最后一位校验码算法如下即第18位数字的计算方法):
. 将前面的身份证号码17位数分别乘以不同的系数。从第1位到第17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
. 将这17位数字和系数相乘的结果相加(17个乘积相加)
. 将相加后的和除以11并得到余数(用加出来和除以11看余数是多少)
. 余数只可能为0 1 2 3 4 5 6 7 8 9 10这11个数字,其分别对应的身份证最后一位校验码为 1 0 X 9 8 7 6 5 4 3 2
. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2
校验码: y -> 该位数值可通过前17位计算获得,具体如下:
18位号码加权因子为(从右到左): Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]
验证位: Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
i为身份证号码从右往左数的2...18位
Y_P为脚丫校验码所在校验码数组位置
各省代码含义
华北:北京11,天津12,河北13,山西14,内蒙古15
东北: 辽宁21,吉林22,黑龙江23
华东: 上海31,江苏32,浙江33,安徽34,福建35,江西36,山东37
华中: 河南41,湖北42,湖南43
华南: 广东44,广西45,海南46
西南: 四川51,贵州52,云南53,西藏54,重庆50
西北: 陕西61,甘肃62,青海63,宁夏64,新疆65
特别:台湾71,香港81,澳门82
一、四个直辖市:
1、北京11
2、天津12
3、上海31
4、重庆50
二、五个自治区:
1、内蒙古15
2、新疆65
3、西藏54
4、宁夏64
5、广西45
三、两个特别行政区:
1、香港特别行政区810000
2、澳门特别行政区820000
四、23个省 :
1、黑龙江省23
2、吉林省22
3、辽宁省21
4、河北省13
5、山西省14
6、青海省63
7、山东省37
8、河南省41
9、江苏省32
10、安徽省34
11、浙江省33
12、福建省35
13、江西省36
14、湖南省43
15、湖北省42
16、广东省44
17、海南省46
18、甘肃省62
19、陕西省61
20、四川省51
21、贵州省52
22、云南省53
23、台湾省710000