(1) 18 ID 番号の構造
国民識別番号は、17 桁のボディ コードと 1 桁のチェック コードで構成される特徴的な組み合わせコードです。
左から右へ、6 桁の住所コード、8 桁の生年月日コード、3 桁のシーケンス コード、1 桁のチェック コードの順です。
1. 住所コード
コーディング オブジェクトの永住地が所在する郡 (市、旗、地区) の行政区画コードを示し、GB/T2260 の規定に従って実装されます。
2. 生年月日コード
エンコードオブジェクトの誕生年、月、日を示します。GB/T7408 の規定に従って実装されます。年、月、日のコードの間に区切り文字はありません。
3. シーケンスコード
同じ住所コードで特定される地域内で同じ年、月、日に生まれた人に割り当てられる通し番号を示します。男性には通し番号が、女性には偶数が割り当てられます。
4. チェックコードの計算手順
(1) 17桁オントロジーコードの加重加算式
S = Sum(Ai * Wi)、i = 0, ... , 16、最初に最初の 17 桁の重みを合計します。
Ai:ID番号の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
チェックコード: 1 0 X 9 8 7 6 5 4 3 2
(2) 17桁のオントロジーコードからチェックコードの下一桁を取得するプログラム例
次のようにコードをコピーします。
パブリック クラス Id18 {
int[] Weight={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //17 桁のボディコードの重み
char[] validate={ '1','0','X','9','8','7','6','5','4','3','2'} ; //mod11、チェックコード文字値に対応
public char getValidateCode(String id17){
int 合計 = 0;
intモード=0;
for(int i=0;i<id17.length();i++){
sum=sum+Integer.parseInt(String.valueOf(id17.charAt(i)))*weight[i];
}
モード=合計%11;
検証[モード]を返します;
}
public static void main(String[] args){
Id18 テスト = 新しい Id18();
System.out.println("この ID カード認証コード:"+test.getValidateCode("14230219700101101")); //この ID カード認証コード: 3
}
}
(3) 説明
1. プログラムは、既存の 17 桁のオントロジー コードに基づいて、対応する検証コードを取得できます。
2. このプログラムは、間違った認証コードを持つ ID 番号を削除することができます。
3. 15桁IDカードの誕生年は、チェックコードの下1桁を除いた西暦の下2桁となります。
4. 完全な ID カードは 18 桁であり、最後のチェック ディジットは数字以外の場合があります。私たちのプロジェクトの 1 つでは、データベースが最初の 17 桁を保存するため、一部の SQL ステートメント (内部結合など) を高速化できます。 ! !