18位的身份证的最后一位是校验码,这个校验码采用的是ISO 7064 Mod 11-2校验系统实现的,其校验公式如下:
公式说明:
- n:字符串的字符个数(包括校验码)
- i:字符位置序号(由右至左,包括校验码,空格与分隔符不及),即最右边的字符i=1
- ai:字符值,0-10,10用X表示
- r:底数,2
- M:模数,11
java实现:
private static char check(String str)
{
int len = str.length();
char[] ary = str.toCharArray();
int sum = 0;
for(int i = 0; i < len;i++)
{
int v = 0;
char cur = ary[i];
if(cur == 'X' || cur == 'x')
v = 10;
else
v = Character.getNumericValue(cur);
sum += v;
sum <<= 1;
}
int temp = (12 - sum % 11) % 11;
if(temp == 10)
return 'x';
return Character.forDigit(temp, 10);
}