版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82915005
对身份证号码前 17 位通过一段算法规则进行计算,可得出身份证号码最后 1 位的值
所以身份证号码最后一位实际上是身份证号码校验码
更多精彩
- 更多技术博客,请移步 asing1elife’s blog
结构
- 地址码 - 6 位
- 表示编码对象常住户口所在市区县的行政区域划分代码
- 按 GB/T2260 规定执行
- 出生日期码 - 8 位
- 表示编码对象出生的年月日
- 按 GB/T7408 规定执行
- 顺序码 - 3 位
- 表示在他同一地址码所标识的区域范围内,对同年同月同日出生的人编订的顺序码
- 顺序码奇数为男生,偶数为女生
- 校验码 - 1 位
- 前 17 位数字本体码加权求和
- S = Sum(Ai * Wi)
- Ai : 表示 0 - 17 位身份证号码的数值 0 - 9
- Wi : 表示 0 - 17 位身份证号码的加权因子 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
- 根据求和结果计算模
- Y = mod(S, 11)
- 根据模查找对应校验码
- Y 0 1 2 3 4 5 6 7 8 9 10
- 校验码 1 0 X 9 8 7 6 5 4 3 2
- 前 17 位数字本体码加权求和
实现
- 通过计算获取第 18 位的校验码
// 十七位数字本体码权重
int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// mod 对应校验码字符值
char[] validate = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
public char getValidateCode(String id17) {
int sum = 0;
int mode = 0;
for (int i = 0; i < id17.length(); i++) {
sum = sum + Integer.parseInt(String.valueOf(id17.charAt(i))) * weight[i];
}
mode = sum % 11;
return validate[mode];
}