昨天看到了李永乐老师的视频,史上最靓身份证号
拿220202022002020022为例:
1. 前6位 220202为地区编码,22为吉林身,02为吉林市,02为昌邑区
2. 中间8位是出生日期
3. 接着的3位是顺序码,第17位奇偶分别代码男女
4. 最后一位是校验码, 取值为0-9,X。
校验码类似于CRC校验码这种东西,其值需要满足一定的公式
意思是,ai和wi的乘积的和与1对于11同余
wi是2^(i-1)对11取余
ai | 2 | 2 | 0 | 2 | 0 | 2 | 0 | 2 | 2 | 0 | 0 | 2 | 0 | 2 | 0 | 0 | 2 | 2 |
wi | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 |
校验代码如下:
private boolean checkId(String id){
char[] chars = id.toCharArray();
int[] ints = new int[18];
for (int i = 0; i < chars.length; i++) {
if(chars[i] == 'X' || chars[i] == 'x'){
ints[i] = 10;
}else{
ints[i] = chars[i] - 48;
}
}
List<Integer> aiList = IntStream.of(ints).boxed().collect(Collectors.toList());
AtomicInteger index = new AtomicInteger();
List<Integer> wiList = IntStream.of(ints).map(i -> (int) Math.pow(2, 18 - index.incrementAndGet()) % 11)
.boxed()
.collect(Collectors.toList());
int sum = IntStream.range(0, aiList.size())
.map(i -> aiList.get(i) * wiList.get(i))
.sum();
return sum % 11 == 1;
}