生成一定数量的身份证号码用于测试
import java.util.*;
public class Main {
public static void main(String[] args) {
//获取n个身份证号,方便测试
//现在的身份证号的第18位使用的是**ISO 7064:1983.MOD11-2**校验码计算法获取的
// 返回一个0~(指定数-1)之间的随机值
//校验值 好像不太对 没有使用
//char[] verifyValue = new char[]{'1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'};
//加权因子
int[] weightingFactor = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int j = 0;
while (true){
//测试用 身份证号{5,1,0,7,2,3,1,9,9,4,1,2,0,9,2,8,7} 18位为 4
int[] cardId = new int[17];
StringBuilder sb = new StringBuilder(18);
for(int i=0;i<cardId.length;i++){
Random random = new Random();
int ran = random.nextInt(10);
sb.append(ran);
cardId[i] = ran;
}
//计算17位数字各位数字与对应的加权因子的乘积的和s
int s = 0;
for(int h = 0 ;h<cardId.length;h++){
s = s+cardId[h]*weightingFactor[h];
}
//计算s÷11的余数t
int t = s%11;
//获取校验码
//int wf = verifyValue[t];
//计算(12-T)÷11的余数r
int r = (12-t)%11;
if (10 == r){
sb.append('X');
}else{
sb.append(r);
}
//生成的 身份证件号:
//System.out.println(cardId.length);
System.out.println(sb.toString());
//生成多少个
j++;
//生成10000个
if (j==10000){
break;
}
}
}
}
校验身份证的工具类
//现在的身份证号的第18位使用的是**ISO 7064:1983.MOD11-2**校验码计算法 校验的
public static boolean idCardVer(String idCard18) {
//待验证身份证不能为空, 且长度为18
if (StringUtils.isEmpty(idCard18) || (idCard18 = idCard18.trim()).length() != 18){
return false;
}
//加权因子
int[] weightingFactor = new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int[] cardId = new int[17];
for (int i = 0; i < cardId.length; i++) {
int ran = Integer.valueOf(idCard18.substring(i, i + 1));
cardId[i] = ran;
}
//计算17位数字各位数字与对应的加权因子的乘积的和s
int s = 0;
for (int h = 0; h < cardId.length; h++) {
s = s + cardId[h] * weightingFactor[h];
}
//计算s÷11的余数t
int t = s % 11;
//计算(12-T)÷11的余数r
int r = (12 - t) % 11;
String num18 = idCard18.substring(17, 18);
System.out.println(num18);
System.out.println(r);
if (10 == r && "x".equalsIgnoreCase(num18)) {
return true;
} else if (r >= 0 && r <= 9 && String.valueOf(r).equals(num18)) {
return true;
}else {
return false;
}
}