주민등록번호 검증 알고리즘 깊이 연구와 자바 실현
(1)18 주민등록번호의 구조
공민 신분번호는 특징 조합 코드로 17자리 디지털 본체 코드와 한 개의 검사 코드로 구성되어 있다.
배열 순서는 왼쪽에서 오른쪽으로 여섯 자리 숫자 주소 코드, 여덟 자리 숫자 출생 날짜 코드, 세 자리 숫자 순서 코드와 한 개의 검사 코드입니다.
1. 주소 번호
인코딩 대상이 상주호구가 있는 현(시, 기, 구)의 행정구역 구분 코드를 표시하고 GB/T2260의 규정에 따라 집행한다.
2. 생년월일 번호
인코딩 대상이 태어난 년, 월, 일을 나타내며 GB/T7408의 규정에 따라 집행되며 년, 월, 일 코드 사이에는 구분자가 없다.
3. 순서 코드
같은 주소 코드에 표시된 구역 범위 내에서 같은 해, 같은 달, 같은 날에 태어난 사람에게 정해진 순서 번호, 순서 코드의 홀수는 남성에게 분배되고 짝수는 여성에게 분배된다.
4, 검증 코드 계산 단계
(1) 17자리 디지털 본체 부호 가중구와 공식
S = Sum(Ai * Wi), i = 0, ... , 16, 먼저 17위 숫자에 대한 권구와
Ai: 제 i 위치의 주민등록번호 숫자 값(0~9)을 나타냅니다.
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (제 i 위치의 가중 인자 표시)
(2) 계산 모드
Y = mod(S, 11)
(3) 패턴에 따라 해당하는 체크코드 찾기
Y: 0 1 2 3 4 5 6 7 8 9 10
체크코드: 10 X 9 8 7 6 5 4 3 2
(2) 17자리 디지털 본체 코드에 따라 마지막 검사 코드 프로그램 실례 얻기
public class Id18 {
int[] weight={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //
char[] validate={ '1','0','X','9','8','7','6','5','4','3','2'}; //mod11,
public char getValidateCode(String id17){
int sum=0;
int mode=0;
for(int i=0;i<id17.length();i++){
sum=sum+Integer.parseInt(String.valueOf(id17.charAt(i)))*weight[i];
}
mode=sum%11;
return validate[mode];
}
public static void main(String[] args){
Id18 test=new Id18();
System.out.println(" :"+test.getValidateCode("14230219700101101")); // :3
}
}
(3) 설명1. 프로그램은 기존의 17자리 디지털 본체 코드에 따라 대응하는 검증 코드를 얻을 수 있다.
2. 이 프로그램은 인증번호가 정확하지 않은 신분증 번호를 제거할 수 있다.
3.15위의 신분증은 출생연도 채택 후 2위이며 마지막 1위 검사 코드가 없다.
4. 온전한 신분증 18위, 마지막 검사 위치는 비숫자일 수 있습니다.우리의 프로젝트는 데이터베이스에 17자리 숫자를 저장합니다. 이렇게 하면 일부 SQL 문장(예를 들어 inner join)에 대응하여 가속 작용을 합니다!!!