身份证号校验算法示例

详见维基

获取身份证校验码

```
private static int[] weight={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //十七位数字本体码权重
private static char[] validate={ ‘1’,’0’,’X’,’9’,’8’,’7’,’6’,’5’,’4’,’3’,’2’}; //mod11,对应校验码字符值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 获取身份证最后一位校验码
 * @param id17 前17位
 * @return 校验位
 */
public static char getValidateCode(String id17){
    int sum=0;
    int mode=0;
    for(int i=0;i<17;i++){
        sum=sum+Integer.parseInt(String.valueOf(id17.charAt(i)))*weight[i];
    }
    mode=sum%11;
    return validate[mode];
}

1
2
### 校验身份证号是否正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 检查身份证号是否正确
 * @param id 身份证号字符数组
 * @return <code>true</code> 表示正确
 */
public static boolean checkID(char[] id){
    int sum = 0,n;
    for (int i = 0; i < 17; i++)
        sum += ((1 << (17-i)) % 11) * (id[i] - '0');
    n = (12 - (sum % 11)) % 11;
    if (n < 10)
        return (n == (id[17] - '0'));
    else
        return (id[17] == 'X');
}

```