在网站中,总有各种各样的表单,用户使用表单来向服务器发送数据,进行交互。 然而,代代相传的经验是,永远不要信任用户的输入,一定要对数据进行验证。如果使用不经验证的表单,轻则会有大量无效提交进入服务器,严重影响网站运行;重则招致XSS攻击~ 所以对输入进行验证是必要的。而为了减轻服务器的压力,除了密码正误等需要向数据库交互才能验证的输入之外,绝大部分输入的验证都应当在前端进行。其中,身份证号的校验就是非常常见的一个。
     

身份证号是中华人民共和国公民的身份编号,有15位(第一代身份证)和18位两种。第一代身份证所采用的15位身份证号,由于没有校验位,故无法进行验证,这里我们讨论现今绝大多数人所使用的18位身份证号的验证方法。15位身份证号也可以通过下面的原理转换成18位身份证号,这里就不列出方法了~   18位身份证号码的构成如下:

XXXXXXXXXXXXXXXXXX
第1-6位:1-2位表示省级行政区代码;3-4位表示地级行政区代码;5-6位表示县级行政区代码
第7-14位:出生年月日
第15-17位:顺序码,其中奇数分配给男性,偶数分配给女性
第18位:校验码

      我们对身份证号的正确性进行验证,就是利用最后一位校验位来进行的~而校验位的算法是这样的:
             公民身份证号码中各个位的数字应满足以下公式的校验:
 
              
               其中:i表示身份证号低位到高位的位序号
                         ai表示该位置上的号码字符值
                         Wi表示该位置上的加权因子,其计算方法: 。各个位的Wi值可直接引用下表:
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

      根据上面的公式,可以推算出校验位与其他位校验关系:

      对于没学过数论的同学(其实我也是现学的),再说一下“同余“的概念:给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即m|(a-b),那么就称整数a与b对模m同余,记作a≡b(mod
m)。

      综上:最终推导出验证身份证号所用的表达式:
       
      若上方表达式成立,则该身份证号有效。


     下面是在JavaScript中的方法实现:
function checkId(){
var code = /* 这里是要校验的身份证号 字符串或者数字都可以 */;
if(code.length == 18){
if(checkMod(code) == true){
alert("正确");
}
else alert("输入的身份证号不正确");
}
else alert("输入的身份证号格式错误。");
} function checkMod(code){
var arr = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],//从第18位到第2位的Wi
proof = code.charAt(17).toUpperCase() == "X" ? 10 : parseInt(code.charAt(17)),//得到输入身份证号的最后一位并将X转换为10
sum = 0;//前十七位的校验和 for(var i = 0;i < arr.length;i++){
sum += code.charAt(i) * arr[i];
}
return (proof + sum - 1) % 11 == 0;
}

完整Demo下载:

身份证号校验原理及JavaScript实现的更多相关文章

  1. Regexp-Utils:身份证号校验

    ylbtech-Regexp-Utils:身份证号校验 1.返回顶部 1.方法 var idCardNoUtil = { /*省,直辖市代码表*/ provinceAndCitys: { 11: &q ...

  2. 使用 python 进行身份证号校验

    使用 python 代码进行身份证号校验 先说,还有很多可以优化的地方. 1.比如加入15位身份证号的校验,嗯哼,15位的好像没有校验,那就只能提取个出生年月日啥的了. 2.比如判断加入地址数据库,增 ...

  3. Javascript 香港身份证号校验

    <!DOCTYPE html> <html> <head> <title>香港身份证校验码计算</title> </head> ...

  4. java身份证号校验

    package com.pt.modules.contract.utils; import java.text.ParseException; import java.text.SimpleDateF ...

  5. 锋利的js之验证身份证号

    我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构  公民 ...

  6. Java实现身份证号码校验

    二话不说,直接上代码. package hope.identitycodecheck.demo; import java.text.DateFormat; import java.text.Simpl ...

  7. javascript实现验证身份证号的有效性并提示

    javascript实现验证身份证号的有效性并提示 function nunber(allowancePersonValue){ if(allowancePersonValue=="身份证号 ...

  8. Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

    Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3.  ...

  9. 身份证号正则校验(js校验+JAVA校验)

    js校验身份证号[15位和18位] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...

随机推荐

  1. 搜索Ex

    哎呀好几天没写POI题解了 (>﹏<) 看着摇曳不定的小旗子深深惶恐 打算开始肝洛谷试炼场的提高分区了[对我就是这么菜… 搜索Ex 比暴搜不错得多的题 洛谷P1514 引水入城 拆成两问来 ...

  2. 【刷题】AtCoder Regular Contest 003

    A.GPA計算 题意:\(n\) 个人,一个字符串表示每个人的等第,每种等第对应一种分数.问平均分 做法:算 #include<bits/stdc++.h> #define ui unsi ...

  3. Centos7下Zabbix3.4至Zabbix4.0的升级步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7下Zabbix3.4至Zabbix4.0的升级步骤 查看现在centos版本和zab ...

  4. BZOJ 193题纪念

  5. 【UR #17】滑稽树前做游戏

    假装看懂的样子 假装会做的样子 UOJ Round #17 题解 加上一个(t-w)^c,c是和i相连的点的度数 是一个多项式的话可以归纳证明 一些具体实现: 多项式存储,保留t,y, f=ai*t^ ...

  6. JS数组冒泡排序&去重

    冒泡排序: var a = [2,1,4,3,6,5]; for(var d = 0 ; d< a.length; d++){ for(var b = d+1; b < a.length; ...

  7. A1102. Invert a Binary Tree

    The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...

  8. Vector 是线程安全的,是不是在多线程下操作Vector就可以不用加Synchronized

    如标题一样,如果之前让我回答,我会说,是的,在多线程的环境下操作Vector,不需要加Synchronized. 但是我今天无意间看到一篇文章,我才发现我之前的想法是错误的,这篇文章的地址: http ...

  9. Persits.Jpeg CMYK-to-RGB

    这几天发现有几个用户上传的图片显示一个“红叉叉”,用迅雷下载一看,原来图片的“模式”是CMYK,这样的模式是不能在IE中正常显示的. 我想起能不能用程序自动转换呢? 在网上看到利用Persits.Jp ...

  10. 迭代器_iter_,生成器yeild,三元运算,列表解析(十三)

    迭代器: l = [1, 2, 3, 4] iter = l.__iter__() print(iter) print(iter.__next__()) print(iter.__next__()) ...