[程序设计]前端Web页面使用原生JavaScript实现校验身份证号码在算法层面是否合法
中国大陆居民身份证号码第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实现校验身份证号码在算法层面是否合法相关推荐
- 使用js在前端web页面调用打印机
使用js在前端web页面调用打印机 最近参与了一个比较老的项目改造,需要使用到打印机相关的技术. 由于打印机也是比较老旧,所以没有SDK相关的应用,虽然有桌面的插件,但是需要集成到web中来,最终找到 ...
- JavaScript实现二代身份证号码转一代身份证号码
项目中需要实现二代身份证号码转一代身份证的功能,在晚上查找了下,网上多是用sql实现,于是参考其算法,用javascript实现.并在html页面中进行了测试,下面将页面代码直接贴出来,供大家参考. ...
- JavaScript正则表达式验证身份证号码是否合法
在用户注册页面有些需求要求的比较严格,需要对身份证js验证是否合法,通过此功能严格此系统软件,从而过滤到很多水客.下面就此实现方法给大家讲解下. 很多时候我们都是通过一组正则表达式来判断用户输入的身份 ...
- 前端web页面防截屏水印生成方案(网页水印+图片水印)
前端水印生成方案 前段时间做某系统审核后台,出现了审核人员截图把内容外部扭曲的情况,虽然截图内容不是特别敏感,但是安全问题还是不能忽略.于是便在系统页面上面加上了水印,对于审核人员截图等敏感操作有一定 ...
- 【虚幻引擎】UE4/UE5数字孪生与前端Web页面匹配
一.数字孪生 数字孪生是一种多维动态的数字映射,可大幅提高效能.数字孪生是充分利用物理模型.传感器更新.运行历史等数据,集成多学科.多物理量.多尺度.多概率的仿真过程,在虚拟空间中完成对现实体的复制和 ...
- 前端web页面实现手机端扫码登录
今天做项目实现了这个功能,不妨就记下来啦 首先前提是手机和电脑服务器要在同一个局域网内部 在服务器的前端页面,我们可以写一个li标签列表,li里面的class样式等可以实现在页面上显示一个手机图标样式 ...
- 前端web页面通过VUE集成H5直播、点播播放器LivePlayer
基于VUE和webpck的前端工程 这里可以参考 https://github.com/livegbs/GB28181-Server 1.安装@liveqing/liveplayer npm -i @ ...
- 直播网站使用html5播放器,前端web页面通过VUE集成H5直播、点播播放器LivePlayer
基于VUE和webpck的前端工程 1.安装@liveqing/liveplayer npm -i @liveqing/liveplayer --save-dev 2.webpack.config.j ...
- 简单前端web页面文字防复制 粘贴 剪切 鼠标右键 F12 shift+ctrl+i等,多浏览器支持
简单的实现javaScript层面的文字防复制,只能说防君子不妨小人,有兴趣的人可以试试 <!DOCTYPE html> <html > <head> <me ...
最新文章
- mysql数据库常见进阶使用
- spring bean scope作用域及多线程安全问题场景分析
- mysql isam参数优化_MySQL MyISAM优化设置点滴
- multi-byte wide-char
- HDU 4722	Good Numbers 2013年四川省赛题
- 关于sfc /scannow后主题文件的重置
- 手动卸载McAfee
- 等额本息和等额本金 计算公式
- Android font-awesome 4.2 icons png(包含holo-light和holo-dark)
- 计算机桌面文件删除不掉是怎么了,文件删不掉怎么办?如何删除一个删不掉的文件?...
- word中怎么把脚注转换为尾注
- 人性化的绘画界面设计-屁民科普
- Airbnb民宿预订
- 聚合型代码审计工具QingScan使用实践
- 行测-判断推理-类比推理-语法关系
- thinkphp6项目的支付宝手机网页支付接入
- matlab负序,Matlab对称分量法计算正序负序零序
- 最后一场2022卡塔尔世界杯预选赛,巴西队与阿根廷队不踢了
- 2020~2022年软件测试的五大趋势
- python实战技能之数字求和