You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// return true if input is a valid bank card no, otherwise return falsefunctioncheckBankCardNo(input){return/^62(\d{14}|\d{17})$/.test(input)&&luhnCheck(input)}
公式说明: i:表示号码字符从右至左(包括校验码在内)的位置序号,最右侧数字 i 为 1,计算时不包含最侧的校验位; ai:表示第i位置上的号码字符值; Wi:示第i位置上的加权因子,其数值依据公式Wi=2^(i-1)mod 11计算得出。
由于身份证号固定 18 位,可以预先计算出所有权重值,后续查表加快校验过程。
i
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
Wi
7
9
10
5
8
4
2
1
6
3
7
9
10
5
8
4
2
1
第二步:将上一步结果模 11 后查表
计算出c后,根据下表查出对应的校验码:
j
0
1
2
3
4
5
6
7
8
9
10
Q
1
0
X
9
8
7
6
5
4
3
2
上面的表格是通过下面公式计算出来的:
Q = (12-j) mod 11, j=[0, 10], j ∈ N
算法的 JavaScript 实现如下:
/** * Check input ID card no. is valid or not * @param {string} input - ID card no. * @returns return true if input card no. is valid, otherwise return false */functioncheckIDCardNo(input){varsum=0varW=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1]varQ='10X97865432'for(vari=0;i<input.length-1;++i){sum+=input[i]*W[i]}returnQ[sum%11]===input[i];}
上面的校验算法仅身份证号是否符合 MOD 11 校验规则,实际应用还需要校验卡号的长度和类型,下面是身份证号完整的校验函数:
// return true if input is a valid ID card no., otherwise return falsefunctioncheckIDCardNo2(input){return/^\d{17}(\d|X)$/.test(input)&&checkIDCardNo(input)}
1. 银行卡号(Bank Card Number)
平时生活中钱包里面充满了各种各样的卡,如信用卡、借记卡、礼品卡、会员卡和VIP卡等等,这些卡号并非随意定制的,都遵循国际标准 ISO/IEC 7812,开发过程中接触到较多的是银行卡号,下面主要说下银行卡号的组成和校验。银行卡一般长下面这样:
1.1 卡号组成
银行卡号一般是 16 位(信用卡/借记卡)或 19 位(借记卡)
第 1 位
卡号首位表示主要产业标识符(Major Industry Identifie, MII),由国际标准化组织于1989年首次发布,通过该值可以区分卡号的发行者所属行业,所有取值见下表:
第 1-6 位
卡号前 6 位表示发行者标识代码(Issuer Identification Number, IIN),也称位发卡行识别码(Bank Identification Number, BIN),包含第 1 位产业标识符 MII,通过 IIN 可以区分卡号的发行机构。
第 7-X 位(长度可变,6-12位)
除去卡号前 6 位和最后 1 位,中间数字表示个人账号标识,中间数字由发行机构自定义,由6-12位数字组成。每个银行的个人账号标识规则有所不同。有的银行在这部分内容中会包含分行、支行、储蓄网点等代码信息。有得银行可能就没有这么详细,会使用自然流水顺序码。
最后 1 位
最后 1 位表示校验位,由卡号前面的数字(不含最后 1 位)采用Luhn算法计算得出。
1.2 卡号校验
卡号的最后一位都是通过Luhn算法进行计算或校验。luhn 算法也称为“mod 10”算法(源于算法最后一步操作是模10),它是一个简单的 checksum 算法。使用 luhn 算法校验的数字串,最后一位是校验位,使用 luhn 算法可校验数字串是否有效。
其具体算法步骤如下:
1.1 偶数位数字乘以 2 后,如果结果大于 9,则将结果的个位和十位相加后返回(16: 1+6=7),否则返回结果
假设数字串为
7992739871x
(x
是校验位),下面是算法第 1 步的计算过程示例:luhn 校验算法的 JavaScript 实现如下:
上面的校验算法仅校验卡号是否符合规则,实际应用还需要根据具体场景校验卡号的开头位和长度等,下面是银联卡号完整的校验函数:
上面两段代码的在线示例:https://runkit.com/whinc/luhn-check-algorithm
参考:
2. 身份证号(ID Card Number)
中国居民身份证
2.1 卡号组成
身份证号码一共有18位数字,各位数字代表的含义:
1,2
位数字表示:所在省份的代码;3,4
位数字表示:所在城市的代码;5,6
位数字表示:所在区县的代码;7-14
位数字表示:出生年、月、日;15,16
位数字表示:所在地的派出所的代码;17
位数字表示性别:奇数表示男性,偶数表示女性;18
位数字是校检码:根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的校验码,取值 0-10(10 用 X 表示)。省市区(县)代码
我们把身份证前六位地址码码,按ABCDEF表示。
AB 表示身份证主人所在的省(直辖市、自治区、特别行政区)代码。
CD 表示地区代码(地级),省的城市代码从省会开始排,只有地级城市有独立的城市代码,而县级市没有。
EF 表示为县区代码(市辖区、郊区、郊县、县级市)。
例如,广东省深圳市南山区,对应的身份证前 6 位是
440305
完整的全国省市区(县)代码可以参考中华人民共和国国家统计局最新县及县以上行政区划代码(截止2016年7月31日)。
出生日期
按照格式
YYYYMMDD
表示,例如公历一九九一年一月一日出生对应的日期为19910101
派出所代码
暂未查到官方的派出所代码出处,如果你知道,恳请在评论里告诉我。
2.2 身份证校验
身份证号最后一位使用ISO 7064:1983.MOD 11-2算法得出,其算法很简单,一句话描述:将每位数字与其对应的权重的乘积之和模11后查表。具体的计算过程见下面:
第一步:计算权重之和
每位数字拥有不同的权重
Wi
,其计算方法如下:公式说明:
i
:表示号码字符从右至左(包括校验码在内)的位置序号,最右侧数字 i 为 1,计算时不包含最侧的校验位;ai
:表示第i
位置上的号码字符值;Wi
:示第i
位置上的加权因子,其数值依据公式Wi=2^(i-1)mod 11
计算得出。由于身份证号固定 18 位,可以预先计算出所有权重值,后续查表加快校验过程。
第二步:将上一步结果模 11 后查表
计算出
c
后,根据下表查出对应的校验码:上面的表格是通过下面公式计算出来的:
算法的 JavaScript 实现如下:
上面的校验算法仅身份证号是否符合 MOD 11 校验规则,实际应用还需要校验卡号的长度和类型,下面是身份证号完整的校验函数:
上面两段代码的在线示例:https://runkit.com/whinc/5a31213aeb0c1a0011c3af56
参考:
3 手机号(Phone Number)
中国手机号示例:
15975383481
3.1 手机号组成
中国使用的手机号码为11位,使用 MDN 结构
CC + MAC + H0 H1 H2 H3 + ABCD
,各字段含义如下:CC
:国家码MAC
:移动接入码,用于区分运营商H0H1H2H3
:HLR(Home Location Register) 归属识别码,由运营商统一分配,每个移动运营商会为全国的地级市编上一个四位数代码,用于识别手机归属地ABCD
:移动用户号,由各 HLR 自行分配,用于区分同一地区不同用户中国大陆号码开头的含义及说明(不一定完整,仅作了解):
10
11
12
13
14
15
16
17
18
19
20
,30
8
,9
3.2 手机号的校验
根据上面表格整理的号码含义,可制定下面校验规则:
1
3,4,5,7,8
上面代码的在线示例:https://runkit.com/whinc/5a3274f8c8531200128328a7
参考
4. 小结
本文总结了常见的银行卡号、身份证号和手机号的组成及校验方法,并提供了完整的示例代码。
The text was updated successfully, but these errors were encountered: