在网站中,总有各种各样的表单,用户使用表单来向服务器发送数据,进行交互。 然而,代代相传的经验是,永远不要信任用户的输入,一定要对数据进行验证。如果使用不经验证的表单,轻则会有大量无效提交进入服务器,严重影响网站运行;重则招致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. 51nod 1061 最复杂的数V2

    题目链接 51nod 1061 题面简述 求\([1, n]\)中约数个数最多的数. \(n \le 10^{200}\) 题解 首先,答案一定是一个反素数. 什么是反素数? 一个正整数\(x\)是反 ...

  2. 【转】用宏定义代替printf函数

    问题提出 有时候我们想用宏定义来决定是编译debug版本的代码还是release的代码,dubug版本的代码会通过printf打印调试信息,release版本的代码则不会.我们总不能对每一条print ...

  3. Java NIO -- 通道 Channel

    通道(Channel):由 java.nio.channels 包定义的.Channel 表示 IO 源与目标打开的连接.Channel 类似于传统的“流”.只不过 Channel本身不能直接访问数据 ...

  4. AutoCompleteTextView 简单用法 实现自定义list adapter

    网上有不少教程,那个提示框字符集都是事先写好的,例如用一个String[] 数组去包含了这些数据,但是,我们也可以吧用户输入的作为历史记录保存       下面先上我写的代码:import andro ...

  5. theano使用

    一  theano内置数据类型 只有thenao.shared()类型才有get_value()成员函数(返回numpy.ndarray)? 1. 惯常处理 x = T.matrix('x') # t ...

  6. Shell变量的取用、删除、取代与替换

    <<鸟哥的私房菜>> 注意: 通配符适用的地方:shell命令行或者shell脚本中 正则表达式适用的地方:字符串处理时,一般有一般正则和Perl正则. 在文本过滤工具里,都是 ...

  7. javascript 模拟京东关闭广告栏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. json遍历 分别使用【原】

    json遍历 一 使用org.json.JSONObject遍历 之后的所有遍历都参考了:http://blog.csdn.net/u010648555/article/details/4981538 ...

  9. nginx配置url中带问号的rewrite跳转

    今天收到一个需求,要将一个带查询参数的url跳转到另外一个静态url,安装常规的rewrite规则,如: rewrite ^/a.html?id=67$ http://zt.epython.cn/20 ...

  10. iscroll.js 手机上下滑动 加载更多

    html <!DOCTYPE html> <html> <head> <title>下拉上拉刷新页面代码</title> <meta ...