Skip to content

sincerefly/IDCardQuery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IDCardQuery

输入身份证号码, 判断 18 位身份证号码是否合法, 并查询信息(性别, 出生日期, 归属地)

简介

不同语言版本的身份证信息查询,带合法性检验。各版本均将纯校验逻辑与**归属地查询(读取 data.json)**分离,便于单元测试,并对错误输入(长度、非数字、校验码不符)做了健壮性处理。

版本与运行

语言 运行 测试
C cd c && make && ./query 431025197610125362 make test
Python cd python3 && python3 query.py 431025197610125362 python3 -m unittest
Node.js cd nodejs && node query.js 431025197610125362 node --test
JavaScript (浏览器) javascript/ 起静态服务器后打开 index.html 核心逻辑与 Node.js 版一致
Go cd golang && go run . 431025197610125362 go test ./...
Rust cd rust && cargo run -- 431025197610125362 cargo test
TypeScript cd typescript && node src/query.ts 431025197610125362 node --test src/idcard.test.ts

TypeScript 直接由 Node.js(>=22) 的类型擦除运行,无需编译;类型检查可执行 npm install && npm run typecheck

公共测试向量

所有语言的单测共用以下用例:

号码 结果
431025197610125362 合法,女,19761012,湖南省临武县
110101199001010015 合法,男,19900101,北京市东城区
11010119900101100X / ...100x 合法,校验码 X 大小写均接受
431025197610125361 不合法(校验码不匹配)
12345 不合法(长度错误)
A31025197610125362 不合法(前 17 位含非数字)

验证原理

  1. 将前面的身份证号码 17 位数分别乘以不同的系数, 从第一位到第十七位的系数分别为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
  2. 将这 17 位数字和系数相乘的结果相加.
  3. 用加出来和除以 11, 看余数是多少?
  4. 余数只可能有 <0 1 2 3 4 5 6 7 8 9 10> 这 11 个数字, 其分别对应的最后一位身份证的号码为 <1 0 X 9 8 7 6 5 4 3 2>.
  5. 通过上面得知如果余数是 2,就会在身份证的第 18 位数字上出现罗马数字的 Ⅹ。如果余数是 10,身份证的最后一位号码就是 2.

例如: 某男性的身份证号码是 34052419800101001X, 我们要看看这个身份证是不是合法的身份证.

首先: 我们得出, 前 17 位的乘积和是 189.

然后: 用 189 除以 11 得出的余数是 2.

最后: 通过对应规则就可以知道余数 2 对应的数字是 X. 所以, 这是一个合格的身份证号码.

About

输入身份证号码,判断18位身份证号码是否合法,并查询信息(性别,年龄,所在地)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors