https://github.com/oxcow/id-number-validator
- 校验规则
15位身份证号码编码规则
-
ddddddyymmddxxp
- dddddd: 地区码
- yymmdd: 出生年月日
- xx: 顺序类编码,无法确定
- p: 性别。奇数位男,偶数为女
18位身份证号码编码规则
-
ddddddyyyymmddxxxy
- dddddd: 地区码
- yyyymmdd: 出生年月日
- xxx:顺序类编码,无法确定。奇数为男,偶数为女
- y: 校验位。可通过前17位计算获取
校验规则
- 加权因子Wi
从右到左依次定义为:
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 ]
- 其中 10 身份证中用 X 替代。
- 校验位位置
Y_P = mod(Σ(Ai+Wi),11)
- 其中下标 i 为身份证号码 从右往左 的 2…8 位; Ai为身份证号对应位数值。
该公式表示将身份证的前17位与其对应的加权因子 Wi 相乘并求和,再将得到的结果与 11 求模,所得的结果即为校验位值所在的位置。然后直接在校验位值 Y 中查找即可得到校验位值.
比如有一为 330304197002051590 的身份证号,那么最后一位校验位 0 的验证过程如下:
- 加权求和
3×7 + 3×9 + 0×10 + 3×5 + 0×8 + 4×4 + 1×2 + 9×1 + 7×6 + 0×3 + 0×7 + 2×9 + 0×10 + 5×5 + 1×8 + 5×4 + 9×2 = 221 - 求模
221 % 11 = 1 - 获取验证位数值
Y[1] = 0
javascript编码实现
针对上述身份证生成规则的描述,在验证时针对15位身份证号只需要判断其出生日期是否正确即可;而针对18位身份证号,除了验证出生日期外还需要对最后的校验位进行验证。
因此我们命名一个名为getIdCardInfo
的函数,接受身份证号作为参数进行验证。该函数返回身份证信息对象。该对象具有5个属性,分别为:
- isTrue : 身份证号是否有效。默认为 false
- year : 出生年。默认为null
- month : 出生月。默认为null
- day : 出生日。默认为null
- isMale : 是否为男性。默认false
- isFemale : 是否为女性。默认false
源代码
您可进入该项目的GitHub页进行下载或贡献
验证示例
验证
http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/