中国大陆居民身份证号码第18位为校验码,用来验证本体码的准确性

校验码采用ISO 7064:1983,MOD 11-2校验码系统。

因此可以对身份证号码第18位进行校验,来验证身份证号码在算法层面是否合法

由于校验码系统算法的原因,如果身份证号码前17位中有多位错误,仍有可能通过验证

GB11643-1999中对校验码描述如下图


JavaScript实现代码如下

开发版本

/** File: MOD11-2.js* Author: 张泽楠* Copyright ©2020 张泽楠, All Rights Reserved* SPDX-License-Identifier: Apache-2.0* Time: 2020-‎11‎-‎8‎ 18:25*//** ISO 7064:1983,MOD 11-2 校验码系统* * @param: *          id  待校验身份证号码,请使用字符串传入* @return: *           ture    通过MOD11-2校验*            false   未通过MOD11-2校验*           NaN     传入参数存在无法解析的非数字字符*           -1      传入参数长度有误*/function MOD11_2(id) {/** ISO 7064:1983,MOD 11-2 校验码系统的校验算法* *  i: 位置索引* wi: 权重* ai: 身份证号码(身份证号码中使用罗马数字"Ⅹ"代替数字10)* * 权重wi: * wi = 2^(18-i) mod 11* * 校验码a18: * ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐* │i │1 │2 │3 │4 │5 │6 │7 │8 │9 │10│11│12│13│14│15│16│17│18│* ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤* │wi│7 │9 │10│5 │8 │4 │2 │1 │6 │3 │7 │9 │10│5 │8 │4 │2 │  │* ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤* │ai│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │* └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘* * 计算公式:*                ┌            ┐*                │ 17         │ * a18 = ( 12 - ( │ ∑  (wi*ai) │ mod 11 ) ) mod 11*                │ i=1        │*                └            ┘*/// --------------- 判断传入参数长度 -----------------if (18 != id.length) {console.log(`<MOD11-2.js>error:     传入参数长度有误parameter: id = ${id}require:   id.length == ${18}found:     id.length == ${id.length}`);return -1;}// --------------- 将字符串转换为数组 -----------------var idList = id.split("");if ("X" == idList[17] || "x" == idList[17] || "Ⅹ" == idList[17]) {idList[17] = "10"}for (var i = 0; i < 18; i++) {idList[i] = parseInt(idList[i]);if (isNaN(idList[i])) {console.log(`<MOD11-2.js>error:     传入参数存在无法解析的非数字字符parameter: id = ${id}require:   isNaN(id) == ${false}found:     isNaN(id) == ${true}`);return NaN;}}// --------------- 权重wi -----------------// wi只与位置索引有关,在此不做重复计算,直接声明weightList并赋值// var weightList = [];// for(var i=1; i<18; i++){//     weightList.push((Math.pow(2, 18-i))%11);// }var weightList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];// --------------- 根据计算公式计算 -----------------var sum = 0;for (var i = 0; i < 17; i++) {sum += weightList[i] * idList[i];}var checkCode = sum % 11;checkCode = 12 - checkCode;checkCode %= 11;// --------------- 校验完成 -----------------if (checkCode != idList[17]) {console.log(`<MOD11-2.js>error:     未通过MOD11-2校验parameter: id = ${id}require:   id[18] == ${checkCode}found:     id[18] == ${idList[17]}`);} else {console.log(`<MOD11-2.js>success:   通过MOD11-2校验parameter: id = ${id}require:   id[18] == ${checkCode}found:     id[18] == ${idList[17]}`);}return checkCode == idList[17];
};console.info(
`===============================================
File: MOD11-2.js
Author: 张泽楠
Copyright ©2020 张泽楠, All Rights Reserved
SPDX-License-Identifier: Apache-2.0
Time: 2020-‎11‎-‎8‎ 18:25
===============================================
function MOD11_2(id)
-----------------------------------------------
ISO 7064:1983,MOD 11-2 校验码系统
@param:id  待校验身份证号码,请使用字符串传入
@return:ture   通过MOD11-2校验false    未通过MOD11-2校验NaN     传入参数存在无法解析的非数字字符-1      传入参数长度有误
===============================================`
);

生产版本

function MOD11_2(id) {/** File: MOD11-2.js* Author: 张泽楠* Copyright ©2020 张泽楠, All Rights Reserved* SPDX-License-Identifier: Apache-2.0* Time: 2020-‎11‎-‎8‎ 18:25*/if (18 != id.length) {return -1;}var idList = id.split("");if ("X" == idList[17] || "x" == idList[17] || "Ⅹ" == idList[17]) {idList[17] = "10"}for (var i = 0; i < 18; i++) {idList[i] = parseInt(idList[i]);if (isNaN(idList[i])) {return NaN;}}var weightList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];var sum = 0;for (var i = 0; i < 17; i++) {sum += weightList[i] * idList[i];}var checkCode = sum % 11;checkCode = 12 - checkCode;checkCode %= 11;return checkCode == idList[17];
};

[程序设计]前端Web页面使用原生JavaScript实现校验身份证号码在算法层面是否合法相关推荐

  1. 使用js在前端web页面调用打印机

    使用js在前端web页面调用打印机 最近参与了一个比较老的项目改造,需要使用到打印机相关的技术. 由于打印机也是比较老旧,所以没有SDK相关的应用,虽然有桌面的插件,但是需要集成到web中来,最终找到 ...

  2. JavaScript实现二代身份证号码转一代身份证号码

    项目中需要实现二代身份证号码转一代身份证的功能,在晚上查找了下,网上多是用sql实现,于是参考其算法,用javascript实现.并在html页面中进行了测试,下面将页面代码直接贴出来,供大家参考. ...

  3. JavaScript正则表达式验证身份证号码是否合法

    在用户注册页面有些需求要求的比较严格,需要对身份证js验证是否合法,通过此功能严格此系统软件,从而过滤到很多水客.下面就此实现方法给大家讲解下. 很多时候我们都是通过一组正则表达式来判断用户输入的身份 ...

  4. 前端web页面防截屏水印生成方案(网页水印+图片水印)

    前端水印生成方案 前段时间做某系统审核后台,出现了审核人员截图把内容外部扭曲的情况,虽然截图内容不是特别敏感,但是安全问题还是不能忽略.于是便在系统页面上面加上了水印,对于审核人员截图等敏感操作有一定 ...

  5. 【虚幻引擎】UE4/UE5数字孪生与前端Web页面匹配

    一.数字孪生 数字孪生是一种多维动态的数字映射,可大幅提高效能.数字孪生是充分利用物理模型.传感器更新.运行历史等数据,集成多学科.多物理量.多尺度.多概率的仿真过程,在虚拟空间中完成对现实体的复制和 ...

  6. 前端web页面实现手机端扫码登录

    今天做项目实现了这个功能,不妨就记下来啦 首先前提是手机和电脑服务器要在同一个局域网内部 在服务器的前端页面,我们可以写一个li标签列表,li里面的class样式等可以实现在页面上显示一个手机图标样式 ...

  7. 前端web页面通过VUE集成H5直播、点播播放器LivePlayer

    基于VUE和webpck的前端工程 这里可以参考 https://github.com/livegbs/GB28181-Server 1.安装@liveqing/liveplayer npm -i @ ...

  8. 直播网站使用html5播放器,前端web页面通过VUE集成H5直播、点播播放器LivePlayer

    基于VUE和webpck的前端工程 1.安装@liveqing/liveplayer npm -i @liveqing/liveplayer --save-dev 2.webpack.config.j ...

  9. 简单前端web页面文字防复制 粘贴 剪切 鼠标右键 F12 shift+ctrl+i等,多浏览器支持

    简单的实现javaScript层面的文字防复制,只能说防君子不妨小人,有兴趣的人可以试试 <!DOCTYPE html> <html > <head> <me ...

最新文章

  1. mysql数据库常见进阶使用
  2. spring bean scope作用域及多线程安全问题场景分析
  3. mysql isam参数优化_MySQL MyISAM优化设置点滴
  4. multi-byte wide-char
  5. HDU 4722 Good Numbers 2013年四川省赛题
  6. 关于sfc /scannow后主题文件的重置
  7. 手动卸载McAfee
  8. 等额本息和等额本金 计算公式
  9. Android font-awesome 4.2 icons png(包含holo-light和holo-dark)
  10. 计算机桌面文件删除不掉是怎么了,文件删不掉怎么办?如何删除一个删不掉的文件?...
  11. word中怎么把脚注转换为尾注
  12. 人性化的绘画界面设计-屁民科普
  13. Airbnb民宿预订
  14. 聚合型代码审计工具QingScan使用实践
  15. 行测-判断推理-类比推理-语法关系
  16. thinkphp6项目的支付宝手机网页支付接入
  17. matlab负序,Matlab对称分量法计算正序负序零序
  18. 最后一场2022卡塔尔世界杯预选赛,巴西队与阿根廷队不踢了
  19. 2020~2022年软件测试的五大趋势
  20. python实战技能之数字求和

热门文章

  1. 提示未登录,点确认,跳到登陆页
  2. JAVA 时间戳与Date类型的相互转换、格式化日期、字符串日期转Date
  3. Commons Email开源项目使用
  4. 人员规范操作行为识别算法
  5. 数据库基础知识点汇总(事务,索引)
  6. 「File」计算机常见文件数据格式
  7. 浅谈鸽巢原理的证明和简单应用
  8. STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用
  9. 五大定律助你公司走向成功-民兴商学院
  10. app闪退之-- GL error: Out of memory!