js号码验证的实现(组成结构和验证原理)

电脑杂谈  发布时间:2020-07-18 09:02:18  来源:网络整理

号提取省份_号省份代码_号对应省份

今天,一位客户报告说该用户ID无法输入字母“ X”. 让我看看发生了什么. 看到客户发送的屏幕截图,结果只能输入数字. 这种修改很简单,更不用说打开代码了,因为该代码是由同事编写的,我仔细地看了一下,我的心突然变得发冷,js层没有进行验证,而后台也没有进行验证,因此无法使用. ..更改它!

数字识别

ID卡的编码规则如下: 根据《中华人民共和国国家标准GB11643-1999》中有关公民ID号码的规定,公民ID号是由17位数字组成的特征性组合代码. 代码和一位验证码组成.

号提取省份_号对应省份_号省份代码

顺序码(的15到17位数字)是县和区政府管辖下的派出所分配的代码. 每个派出所分配的代码是10个连续的数字,例如“ 000-009”或“ 060” -069”,其中单数是男性分配代码,偶数是女性分配代码. 两个人在同一天号省份代码,同一月和同一天,第二,第三,第四和第五个分配代码将被扩展. 例如: 005是男孩,并且至少有两个男孩在同一年出生,月份和日期,最后四个是001和003. 分配的序列号中的四个序列号“ 999、998、997、996”是针对一百岁以上的男性和女性的特定编号.

校验码(ID卡的最后一位)是根据前17位数字和ISO7064: 1983.MOD11-2校验码计算出的校验码.

从1999年10月1日起,实施国家号码系统,号码从15个增加到18个. 前6位数字是地址码;第7到14位数字是出生日期代码,该代码从6位数字更改为8位数字,其中年份由4位数字表示;第15到第17位数字是已取消的序号. 序号中百岁老人使用的特定数字;第18位是校验码,主要用于验证计算机输入的公民ID号的前17位是否正确. 值的范围是0到10. 等于10时,用罗马数字X表示. 计算方法

号对应省份_号提取省份_号省份代码

2.1用不同的系数乘以前一个号的17位数字. 从第一位到第十七位的系数是: 7-9-10-5-5-8-4-2-2-1-6-3-7-9-10-5-8-4-2.

2.2将这17位数字与系数相乘的结果相加.

2.3使用加法并除以11可以看到余数是什么?

号对应省份_号提取省份_号省份代码

2.3余数只能有11个数字,例如0-1-2-3-4-5-6-7-8-9-10. 与其对应的最后一个ID卡的编号为1-0-X-9-9-8-7-6-6-5-4-2-3. (也就是说,余数0对应于1,余数1对应于0,余数2对应于X ...)

2.5从上面我们可以知道,如果余数为3,则ID卡的第18位将显示9. 如果对应的数字为2,则ID卡的最后一位数字为罗马数字X.

例如: 一个男人的号码是[53010219200508011X],让我们看看该是否符合计算规则?

号省份代码_号提取省份_号对应省份

首先,我们获得前17位的乘积和[(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26) +(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1 * 2)]为189,然后将189除以11,结果为189÷11 = 17,剩余的2号省份代码,187÷11 = 17,剩余的2无法除,表示剩余数为2. 最后,通过相应的规则,您可以知道与剩余的2相对应的校验码为X. 因此,可以确定这是正确的ID号.

以上内容来自百度百科!

当前,ID号码基本上是18位数字,但也有15位数字.

ID号为15位数字时,均为数字. 当它是18位数字时,前17位数字都是数字,下一个是校验位,可以是数字或字母X.

现在您知道ID号码的组成原理,该代码更容易编写,没有太多废话,并且代码(以js代码为例):

//验证号码
function IdentityIDCard(code){
	//号前两位代表区域
  var city = {
    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 idCardReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  var idCardReg 	 = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i;
  var errorMessage = "";//错误提示信息
  var isPass 			 = true;//验证是否通过(true通过、false未通过)
 
  //如果不满足格式正则表达式
  if (!code || !code.match(reg)) {
    errorMess = "您输入的号码有误!";
    isPass = false;
  }
 
  //区域数组中不包含需验证的前两位
  else if (!city[code.substr(0, 2)]) {
    errorMess = "您输入的号码有误!";
    isPass = false;
  }
  else {
    //18位需要验证最后一位校验位
    if (code.length == 18) {
      code = code.split('');
      //∑(ai×Wi)(mod 11)
      //加权因子
      var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
      //校验位
      var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
      var sum = 0;
      var ai = 0;
      var wi = 0;
      for (var i = 0; i < 17; i++) {
        ai = code[i];
        wi = factor[i];
        sum += ai * wi;		//开始计算并相加
      }
      var last = parity[sum % 11];	//求余
      if (parity[sum % 11] != code[17]) {
        errorMess = "您输入的号码有误!";
        isPass = false;
      }
    }
  }
  var returnParam = {
    'errorMess': errorMess,
    'isPass': isPass
  }
  return returnParam;
}


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-284524-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...