大家好,想必各位程序猿已经有所发现,而相应地,在日常的开发任务需求了很多跟涉及到用户的都几乎需要用到身份证的校验,因此不留君特意整理出一份身份证号的组成原理以及

校验函数(js版)

【身份证号码的规则】

6位地方代码+8位出生年月日数字+2位顺序码+1位性别代码+1位校验码

1)地方代码:

地方代码的前两位由特定的省份代码组成,至于原理呢…没有,我们并不需要纠结或者记住来源,只需要校验输入身份证号中的前两位是否在这些省份代码里即可

{

11:”北京”,12:”天津”,13:”河北”,

14:”山西”,15:”内蒙古”,21:”辽宁”,

22:”吉林”,23:”黑龙江 “,31:”上海”,

32:”江苏”,33:”浙江”,34:”安徽”,

35:”福建”,36:”江西”,37:”山东”,

41:”河南”,42:”湖北 “,43:”湖南”,

44:”广东”,45:”广西”,46:”海南”,

50:”重庆”,51:”四川”,52:”贵州”,

53:”云南”,54:”西藏 “,61:”陕西”,

62:”甘肃”,63:”青海”,64:”宁夏”,

65:”新疆”,71:”台湾”,81:”香港”,

82:”澳门”,91:”国外 “};

于是我们可以定义一个省份代码数组,并且编写一个校验前两位的函数:

var checkCityNoIsOk=function (cityNo) {

    var provinceCodeArr = ["11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91"];for (var i = 0; i < provinceCodeArr.length; i++) {if (cityNo == provinceCodeArr[i]) {return true;}}return false;}

有了这个函数,地方代码的校验就妥妥的了,网友可能会疑惑,地方代码不是6位吗,为什么只校验前两位就可以了呢?别急,先走下一个环节

2)出生年月日

出生年月日没什么玄机的,只要校验出年月日是标准的年月日即可,于是我们可以创建一个函数来校验年月日的,如下

var checkBirthIsOk=function(year,month,day){

try{//获取年龄var age = Math.round( (nowdate - bir) / (365 * 24 * 60 * 60 * 1000));   if(age>=18){return true;}}catch(e){//一切不标准的年月日都会抛出异常return false;}return false;

}

代码中有18岁的校验,是因为以前的要求是成年人才有身份证,现在貌似一出生就有身份证号了,如果真是这样,则把18岁的判断限制去掉即可。

3)顺序码:

表示在同一省份代码所标识的区域范围内,对同年同月同日出生的人编定的顺序号,顺序码的奇数为男,偶数为女

4)校验码:

校验码是根据前面17位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码

算出来的校验码范围为1-10但是如果是10为了遵循18位身份证号的规则,就得用X来替代10,这就解释了为什么

有些身份证号码最后一位是X

校验码的规则是:

1.身份证的前17位,每一位乘以一个相应的加权因子

他们对应的因子为[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]

2.得出新的17位数相加。

3.用加出来和除以11求余数

4.余数对应校验表[1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2],其中10展现为X

5.得到余数对应校验表。比如余数是0则结果1 余数是4结果是9…

于是我们可以创建一个函数来校验:

var checkFactorIsOk=function(idCardNo){

   var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];// 加权因子var checktable = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 校验值对应表var checksum = 0;var befor17 = idCardNo.substr(0, 17);for (var i = 0; i < 17; i++) {var num = parseInt(befor17.substr(i, 1)) * factor[i];checksum += num;}//结果求余var yushu = checksum % 11;// 余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字if (yushu > 10) {return false;}var s = checktable[yushu];var checkNoStr = idCardNo.substr(17, 1);if (checkNoStr) {// 如果是“X”或者“x” 第二位 则只能对应 对应表的 10if (checkNoStr == "X" || checkNoStr == "X") {if (s == 10) {return true;} else {return false;}}// 如果不是字母,则最后一位分别对应 对应表 即可else if (parseInt(checkNoStr) == s) {return true;} else {return false;}}

}

最终完整的代码如下:

var checkIdCardIsOk = function (idcardNo) {

//校验省份代码var checkCityNoIsOk = function (cityNo) {var provinceCodeArr = ["11", "12", "13", "14", "15", "21","22", "23", "31", "32", "33", "34","35", "36", "37", "41", "42", "43","44", "45", "46", "50", "51", "52","53", "54", "61", "62", "63", "64","65", "71", "81", "82", "91"];for (var i = 0; i < provinceCodeArr.length; i++) {if (cityNo == provinceCodeArr[i]) {return true;}}return false;}

//校验出生日期

var checkBirthIsOk = function (year, month, day) {try {//获取年龄var nowdate=new Date();var bir = new Date(bstr.substring(0, 4), bstr.substring(4, 6), bstr.substring(6, 8));var age = Math.round((nowdate - bir) / (365 * 24 * 60 * 60 * 1000));if (age >= 18) {return true;}}catch (e) {//一切不标准的年月日都会抛出异常return false;}return false;}

//校验顺序码和校验码

var checkFactorIsOk = function (idCardNo) {var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];// 加权因子var checktable = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 校验值对应表var checksum = 0;var befor17 = idCardNo.substr(0, 17);for (var i = 0; i < 17; i++) {var num = parseInt(befor17.substr(i, 1)) * factor[i];checksum += num;}//结果求余var yushu = checksum % 11;// 余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字if (yushu > 10) {return false;}var s = checktable[yushu];var checkNoStr = idCardNo.substr(17, 1);if (checkNoStr) {// 如果是“X”或者“x” 第二位 则只能对应 对应表的 10if (checkNoStr == "X" || checkNoStr == "X") {if (s == 10) {return true;} else {return false;}}// 如果不是字母,则最后一位分别对应 对应表 即可else if (parseInt(checkNoStr) == s) {return true;} else {return false;}}}if (!idcardNo) {return false;}idcardNo = idcardNo.toUpperCase();//整体校验var isMatch = (/^(\d{17})([0-9]|X)$/.test(idcardNo));if (!isMatch) {return false;}//省份代码校验var city = idcardNo.substr(0, 2);if (!checkCityNoIsOk(city)) {return false;}//出生年月日校验var bstr = idcardNo.substr(6, 8);var year = bstr.substring(0, 4);var month = bstr.substring(4, 6);var day = bstr.substring(6, 8);if (!checkBirthIsOk(year, month, day)) {return false;}//校验码+顺序码校验if (!checkFactorIsOk(idcardNo)) {return false;}return true;

}

使用方法:

var isok=checkIdCardIsOk(“45258119860923393X”);

console.log(isok);//false

到这里本文就基本结束了,至于一开始说的地区代码为何只校验前两位,是因为三四位是市级代码、五六位是县级代码,这些代码数量众多,一一校验会很耗费性能,而在后面的校验码和顺序码的校验会涉及到前面17位,因此只要前面有一位数字是错误的都会导致生成的校验码是错误的,因此校验也不能通过,故而只校验前两位。

觉得本文对你有帮助?请分享给更多人

关注「编程无界」,提升装逼技能

18位身份证号藏了什么玄机?用js教你校验身份证相关推荐

  1. python身份证号掩盖出生日期的代码_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...

    大家好哇,又是一个愉快的周末,今天本鸟给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性别及 ...

  2. 表单校验之---校验姓名/护照正则/台湾往来通行证/校验身份证号/港澳往来通行证正则/军官证正则/检验手机号/校验银行卡号

    常用表单校验 1.校验姓名       2.护照正则      3.台湾往来通行证          4.校验身份证号         5.港澳往来通行证正则 6.军官证正则     7.检验手机号  ...

  3. 判断身份证:要么是15位,要么是18位,最后一位可以为字母,并写程序提出其中的年月日

    package com.demo;public class Demo3 {public static void main(String[] args) {/** 判断身份证:要么是15位,要么是18位 ...

  4. 身份证号第18位(效验码)计算方法 用于检测身份证号是否正确

    前言: 由于在某些时候,可能需要用户输入真实的身份证号,但是用户可能会胡乱输入虚假的身份证号,导致信息的不真实性,所以为了防止用户胡乱输入,可以通过一些小方法来检测身份证号是否输入正确,本文将介绍一种 ...

  5. 比较严谨的java验证18位身份证号码

    /** * 我国公民的身份证号码特点如下* 1.长度18位* 2.第1-17号只能为数字* 3.第18位只能是数字或者x* 4.第7-14位表示特有人的年月日信息* 请实现身份证号码合法性判断的函数, ...

  6. 18位身份证验证(Java)

    我的代码: package day20181016; /** * 身份证的验证 34052419800101001X * */ import java.util.Scanner; public cla ...

  7. Jquery 对 身份证号码的验证 (15/18位)

    //欢迎验证.给予指正错误,从好多地方查来的资料修改的...已用本人身份证验证... 由于以前修改的问题无法验证带 X 的身份证号码,已修复!//为值添加0function Append_zore(t ...

  8. java身份证工具类(校验身份证是否合法、通过身份证获取年龄、性别、生日,将15位身份证转为18位等)

    一.简介 因为工作需要经常用到身份证做一些相关操作,于是通过查阅资料总结出一些常用的工具方法,包括校验身份证是否合法.通过身份证获取年龄.通过身份证获取性别.通过身份证获取户籍地址.通过身份证获取生日 ...

  9. 18位身份证校验位的计算方法

    18位身份证校验位的计算方法 18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定.     GB11643-1999&l ...

最新文章

  1. Mybatis复习笔记3:映射文件详解
  2. Oracle 9i DBA Fundamentals I 学习笔记(三)
  3. C# 使用FileSystemWatcher来监视文件系统的变化
  4. 二.无显示器远程连接树莓派
  5. 远离极限编程 (Don’t do XP)
  6. zabbix利用mutt和msmtp配置邮件报警
  7. 关于数据传输格式的序列化和反序列化
  8. android studio发布版和测试版证书SHA1获取
  9. 21. Upgrade-Insecure-Requests: 1
  10. word排版一般步骤
  11. 计算机网络1MB等于多少b,什么是Mb,1Mb等于多少Kb?
  12. 智能安全帽-4G记录仪等移动视频图传系统里面的RTSP流输出的实现机制
  13. 十进制转二进制,短除法与位运算两种方法
  14. STM32MP157-Linux音频应用编程-语音转文字项目
  15. 56.EasyLikeArea
  16. 【UE4】搭建局域网内VR直播 UE4.27
  17. 电脑很小,电脑快捷键字体很小怎么办
  18. Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 详解
  19. C#汉字转换拼音技术详解
  20. canvas实现炫酷的一键抠图和背景替换

热门文章

  1. 利用netty开发webScoketClient(支持wss协议,客户端、服务端心跳实现)
  2. zabbix 报错No media defined for user.
  3. Jenkins安装并设置中文
  4. 计算机可以配置不同的显示系统,为什么Win7系统显卡显示型号和电脑配置型号不一样...
  5. AFL入门学习<AFL 下载和安装>
  6. 金融服务(银行证券机构方向)etl批量作业集群统一调度平台搭建
  7. ipad1无法安装应用程序_如何在iPad上的应用程序之间拖放
  8. OPJ2.5基本算法之搜索2152:Pots
  9. 红猫linux系统下载教程,RedCat_NSS_红猫linux软路由安装使用手册.doc
  10. C#写入模板excel数据