当前位置: 首页 > news >正文

JavaScript身份证号校验算法

身份证号校验规则

身份证号码的校验主要基于国家标准GB11643-1999,18位身份证号的最后一位是校验码,通过前17位计算得出。校验算法分为以下几个部分:

校验码计算方法

  1. 加权因子
    前17位数字分别乘以对应的加权因子,加权因子为固定值:
    [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]

  2. 计算加权和
    将前17位数字与加权因子逐位相乘,再将结果相加,得到加权和 S

  3. 取模计算
    用加权和 S 除以11,取余数 Y = S % 11

  4. 校验码对应表
    根据余数 Y 的值,从下表查找对应的校验码:
    [1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2]
    校验码为第 Y 位的字符(从0开始)。

实现代码

function validateIDCard(idCard) {// 基本格式校验if (!/^\d{17}[\dXx]$/.test(idCard)) {return false;}// 加权因子const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];// 校验码对应表const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];// 计算加权和let sum = 0;for (let i = 0; i < 17; i++) {sum += parseInt(idCard.charAt(i)) * weights[i];}// 计算校验码const mod = sum % 11;const checkCode = checkCodes[mod];// 校验最后一位return idCard.charAt(17).toUpperCase() === checkCode;
}

其他校验规则

  1. 行政区划码校验
    前6位是行政区划码,需符合国家行政区划编码规则(可通过公开的行政区划代码表校验)。

  2. 出生日期校验
    第7-14位是出生日期,需为合法日期(如月份在1-12之间,日期符合当月天数)。

  3. 顺序码校验
    第15-17位是顺序码,奇数表示男性,偶数表示女性。

完整校验函数

function fullValidateIDCard(idCard) {// 基本格式校验if (!/^\d{17}[\dXx]$/.test(idCard)) {return false;}// 校验行政区划码(示例:仅校验前2位为省级代码)const provinceCode = idCard.substring(0, 2);if (parseInt(provinceCode) > 91 || parseInt(provinceCode) < 11) {return false;}// 校验出生日期const birthDate = idCard.substring(6, 14);const year = parseInt(birthDate.substring(0, 4));const month = parseInt(birthDate.substring(4, 6));const day = parseInt(birthDate.substring(6, 8));const date = new Date(year, month - 1, day);if (date.getFullYear() !== year ||date.getMonth() + 1 !== month ||date.getDate() !== day) {return false;}// 校验校验码return validateIDCard(idCard);
}

注意事项

  • 15位身份证号无校验码,需升级为18位后再校验。
  • 行政区划码和出生日期校验需结合实际需求补充完整逻辑。
  • 校验码计算区分大小写(X 必须大写)。
http://www.dtcms.com/a/418486.html

相关文章:

  • 【centos生产环境搭建(三)jdk环境配置】
  • HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
  • Redis 入门:高效缓存与数据存储的利器
  • 贝尔利网站免费永久php免备案空间
  • Python字典:高效数据管理的瑞士军刀
  • Requests 库详解:爬虫工程师的 “瑞士军刀”
  • 用python实现将csv文件数据插入到mysql
  • 【第十五周】机器学习的学习笔记11
  • 一款强大的开源 MQTT 消息服务器:EMQX
  • 如何 网站优化公司做网站百度可以搜到吗
  • 门户网站 管理系统网站关键词怎么填写
  • lucene 8.7.0 版本中的倒排索引、数字、DocValues三种类型的查询性能对比
  • 关于npm和pnpm
  • Django 中的元类(Metaclass)应用及生产场景示例
  • 以涡度通量塔的高频观测数据为例,基于MATLAB开展;生态碳汇涡度相关监测与通量数据分析实践技术应用
  • 慈溪网站建设哪家好襄阳蒂凯网络网站建设小程序
  • 做网站保存什么格式最好建设银行企业网上银行网站打不开
  • 数据仓库和商务智能考试考点及关系梳理
  • 灵犀互娱笔试
  • 【多线程】什么是原子操作(Atomic Operation)?
  • Visual Studio Code 的 AI 插件汇总
  • Java学习笔记六(集合)
  • 简易分析慢 SQL 的流程和方法
  • Docker 中删除镜像与容器的完整指南
  • 通州手机网站建设北京网站设计实力乐云践新
  • 高速PCB板DDR5数据信号的长STUB要背钻吗?
  • FPGA强化-简易频率计
  • VBScript自动化打印:智能过滤Word文档
  • 解码数据结构内核链表
  • 郑州设计网站公司东莞建设银行电话号码