通过身份证校验位检验身份证正确性

算法:

W[] = 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2

∑(a[i]×W[i])(mod 11)

校验位:1 0 X 9 8 7 6 5 4 3 2

举个栗子:

身份证号:102154198801238569

a[] = 10215419880123856

身份证每一位和W[]每一位相乘后求和,模除以11,取校验位相应的位数即可

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
* Created by lwg
*/
public class BankUtils {
/**
* 校验身份证号
*
* @param idCardNo 身份证号
* @return true通过,false未通过
*/
public static boolean checkIdCardNo(String idCardNo) {
if (null == idCardNo) {
return false;
}
idCardNo = idCardNo.toLowerCase();
if (null == idCardNo || (idCardNo.length() != 18 && idCardNo.length() != 15)) {
return false;
}
String[] RC = {"1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2"};
boolean checkBirthday;
String birthday;

try {
if (idCardNo.length() == 18) {// 18位
birthday = idCardNo.substring(6, 14);
checkBirthday = isDate(birthday, "yyyyMMdd");

int[] W = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int sum = 0;
for (int i = 0; i < idCardNo.length() - 1; i++) {
int c = Integer.parseInt(idCardNo.substring(i, i + 1));
sum += W[i] * c;
}
int r = sum % 11;
if (RC[r].equals(idCardNo.substring(17)) && checkBirthday) {
return true;
} else {
return false;
}
} else {//15位
birthday = "19" + idCardNo.substring(6, 12);
checkBirthday = isDate(birthday, "yyyyMMdd");
if (checkBirthday) {
return true;
} else {
return false;
}
}
} catch (NumberFormatException e) {
e.printStackTrace();
return false;
}
}

/**
* 是否为合法日期
*
* @param dateString 日期
* @param format 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
* @return
*/
public static boolean isDate(String dateString, String format) {
boolean convertSuccess = true;
// 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
SimpleDateFormat smf = new SimpleDateFormat(format);
try {
// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
smf.setLenient(false);
smf.parse(dateString);
} catch (ParseException e) {
//e.printStackTrace();
//如果throw java.text.ParseException或者NullPointerException,就说明格式不对
convertSuccess = false;
}
return convertSuccess;
}
}

通过身份证校验位检验身份证正确性
https://www.wekri.com/verify-IDCard/
Author
Echo
Posted on
March 21, 2018
Licensed under