[身份证号验证算法]


我国现行第二代居民身份证采用18位编码规则,其合法性验证算法遵循国家强制标准《GB 11643-1999 公民身份号码》,是各类信息系统对身份信息进行格式初筛的核心依据,可快速过滤格式错误的无效身份证号。

### 一、18位身份证号的结构含义
要理解验证算法,首先需要明确18位编码的分段规则:
1. 第1-6位:地址码,代表持证人常住户口所在地的县级行政区划代码;
2. 第7-14位:出生日期码,格式为YYYYMMDD,比如19900520代表1990年5月20日出生;
3. 第15-17位:顺序码,是同一地址码区域内同年同月同日出生人员的顺序编号,其中第17位奇数为男性、偶数为女性;
4. 第18位:校验码,是根据前17位按照固定规则计算得出的验证位,取值范围为0-10,其中10用罗马数字X表示,避免编码长度变为19位。

### 二、核心校验码计算规则
校验码的计算是身份证号验证的核心环节,具体步骤如下:
1. 提取身份证号前17位数字,分别与对应的加权因子相乘,加权因子数组固定为`[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]`,第1位对应第1个因子,以此类推;
2. 将17组乘积相加,得到总和S;
3. 用总和S对11取模,得到余数Y(取值范围为0-10);
4. 按照固定对照表`[‘1’, ‘0’, ‘X’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’]`查找余数对应的校验码:余数为0对应校验码1,余数为2对应校验码X,以此类推。

### 三、完整的身份证号验证流程
仅校验最后一位校验码不足以保证身份证号合法,完整验证需要完成以下几步:
1. **长度校验**:首先确认编码长度为18位,若为15位旧身份证,需先进行升位处理(出生日期前补`19`,末尾补充计算出的校验码)再验证;
2. **字符格式校验**:前17位必须全部为数字,第18位只能是数字或大写X(若用户输入小写x需先转换为大写再校验);
3. **出生日期合法性校验**:验证第7-14位的日期是否真实存在,比如`20230230`(2月无30日)、`20990101`(晚于当前日期)均为无效日期;
4. **地址码校验**:验证前6位是否为国家公布的有效行政区划代码,不存在的行政区划编码对应的身份证号无效;
5. **校验码匹配校验**:按照上述规则计算前17位对应的校验码,与身份证号第18位比对,一致则通过校验。

### 四、算法实现示例(Python)
以下是简化版的身份证号校验函数,仅包含核心校验码校验逻辑,实际使用可补充日期、地址码校验规则:
“`python
def verify_id_card(id_card: str) -> bool:
# 长度校验
if len(id_card) != 18:
return False
# 小写x转大写统一格式
id_card = id_card.strip().upper()
# 字符格式校验
if not id_card[:17].isdigit() or id_card[-1] not in “0123456789X”:
return False
# 加权因子与校验码对照表
weight_list = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_code_list = [“1”, “0”, “X”, “9”, “8”, “7”, “6”, “5”, “4”, “3”, “2”]
# 计算校验码
total = sum(int(id_card[i]) * weight_list[i] for i in range(17))
calc_check_code = check_code_list[total % 11]
# 校验码比对
return calc_check_code == id_card[-1]
“`

### 五、算法的局限性
需要注意的是,身份证号验证算法仅能判断编码格式是否符合规则,无法证明该身份证号真实存在、也无法证明号主与持证人一致,若需要核验身份的真实性,必须对接公安部门的人口信息数据库进行查询。

本文由AI大模型(Doubao-Seed-1.6)结合行业知识与创新视角深度思考后创作。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注