根據《中華人民共和國國家標準GB 11643-1999》中有關公民身份號碼的規定,公民身份號碼是特征組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。順序碼的奇數分給男性,偶數分給女性。校驗碼是根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。
下面介紹算法。
先引入公式:
計算公式令結果為 Y,Y的計算公式為:Y = mod(S, 11)根據下表找出 Y 對應的校驗碼即為要求身份證號碼的校驗碼C。
例如:假設某女性居民的15位身份證號碼是320105820927512,32表示江蘇省,01表示南京市,05表示鼓樓區,820927表示1982年9月27日。512表示是該地區同年同月同日的第512人,其中2表示是女性。那么,升級為18位后的號碼為32010519820927512C。下面就根據公式來計算C的值。
Y = mod(S, 11)=MOD(313,11)=5
根據校驗值對應表,可知C=7,該人員身份證號碼為:320105198209275127
又如:某男性公民身份證號碼的本體碼為34052419800101001
查表得該人員身份證號碼為:34052419800101001X
具體實現代碼如下(JAVA):
1
public boolean isIdCard(String arrIdCard) {
2
int sigma = 0;
3
Integer[] a = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
4
String[] w = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
5
for (int i=0; i<17; i++) {
6
int ai = Integer.parseInt(arrIdCard.substring(i,i+1));
7
int wi = a[i];
8
sigma += ai * wi;
9
}
10
int number = sigma % 11;
11
String check_number = w[number];
12
//return check_number;
13
//System.out.println(check_number);
14
if (!arrIdCard.substring(17).equals(check_number)) {
15
return false;
16
} else {
17
return true;
18
}
19
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
