Karena kebutuhan proyek, saya menulis metode C# untuk verifikasi kartu ID berdasarkan informasi online.
/*
*Bagian teoretis:
*15 digit nomor ID = 6 digit kode area + 6 digit tanggal lahir + 3 digit nomor seri
* 18 digit Nomor ID = 6 digit kode area + 8 digit tanggal lahir + 3 digit nomor seri + 1 digit kode verifikasi
*
*Dua digit pertama kode negara setiap provinsi, kota, dan wilayah adalah:
* Beijing 11 Jilin 22 Fujian 35 Guangdong 44 Yunnan 53 Tianjin 12 Heilongjiang 23 Jiangxi 36 Guangxi 45 Tibet 54 Hebei 13 Shanghai 31 Shandong 37 Hainan 46 Shaanxi 61 Shanxi 14 Jiangsu 32 Henan 41 Chongqing 50
Gansu 62 Mongolia Dalam 15 Zhejiang 33 Hubei 42 Sichuan 51 Qinghai 63 Liaoning 21 Anhui 34 Hunan 43 Guizhou 52 Ningxia 64 Xinjiang 65 Taiwan 71 Hong Kong 81 Makau 82 Luar Negeri 91
*Standar KTP 18 digit diatur dengan jelas dalam "Nomor Identitas Warga" GB11643-1999 yang diterapkan oleh Administrasi Mutu dan Pengawasan Teknis Negara pada tanggal 1 Juli 1999.
*GB11643-1999 "Nomor Identitas Warga" adalah versi revisi dari "Nomor Jaminan Sosial" GB11643-1989, yang menyatakan bahwa nama standar asli "Nomor Jaminan Sosial" akan diubah namanya menjadi "Nomor Identitas Warga". "Nomor Identitas Warga" Ini akan menggantikan GB11643-1989 sejak tanggal penerapan.
*Nomor identitas warga negara merupakan kode kombinasi ciri yang terdiri dari tujuh belas digit kode badan dan satu digit kode cek. Urutan dari kiri ke kanan adalah: enam digit kode alamat, delapan digit kode tanggal lahir, tiga digit kode urut, dan satu digit kode cek. Artinya adalah sebagai berikut:
*1. Kode alamat: menunjukkan kode pembagian administratif kabupaten (kota, spanduk, kabupaten) di mana tempat tinggal tetap objek pengkodean berada, dan dilaksanakan sesuai dengan ketentuan GB/T2260.
*2. Kode tanggal lahir: menunjukkan tahun, bulan, dan hari lahir objek pengkodean. Diimplementasikan sesuai dengan ketentuan GB/T7408. 2 digit, dan 2 digit masing-masing, tanpa pemisah di antara keduanya.
*3. Kode urut: menunjukkan nomor urut yang diberikan kepada orang yang lahir pada tahun yang sama, bulan yang sama, dan hari yang sama di wilayah yang diidentifikasi dengan kode alamat yang sama ditugaskan pada perempuan.
*Metode perhitungan verifikasi:
*1. Jumlah tertimbang dari 17 digit pertama kode ontologi
*Rumusnya : S = Jumlah(Ai * Wi), i = 0, ... , 16
*dimana Ai melambangkan nilai digital nomor KTP pada posisi ke-i, Wi melambangkan faktor bobot pada posisi ke-i, dan nilai yang bersangkutan adalah:
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2. Ambil hasil perhitungan modulo 11
*Y = mod(S, 11)
*3. Hubungan yang sesuai antara kode cek yang diperoleh berdasarkan nilai modul adalah:
*Nilai Y: 0 1 2 3 4 5 6 7 8 9 10
*Kode cek: 1 0 X 9 8 7 6 5 4 3 2
*/
kode
1 /// <ringkasan>
2 /// verifikasi kartu identitas
3 /// </ringkasan>
4 /// <param name="Id">Nomor KTP</param>
5 /// <pengembalian></pengembalian>
6 bool publik CheckIDCard (string Id)
7 {
8 jika (Id.Panjang == 18)
9 {
10 cek bool = CheckIDCard18(Id);
11 cek pengembalian;
12}
13 else if (Id.Panjang == 15)
14 {
15 cek bool = CheckIDCard15(Id);
16 cek pengembalian;
17}
18 lainnya
19 {
20 mengembalikan salah;
dua puluh satu }
dua puluh dua }
23 /// <ringkasan>
24 /// Verifikasi KTP 18 digit
25 /// </ringkasan>
26 /// <param name="Id">Nomor KTP</param>
27 /// <pengembalian></pengembalian>
28 bool pribadi CheckIDCard18 (string Id)
29 {
30 panjang n = 0;
31 if (long.TryParse(Id.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(Id.Replace('x', '0') .Ganti('X', '0'), keluar n) == salah)
32 {
33 kembali salah;//Verifikasi nomor
34}
35 string alamat = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36 if (alamat.IndexOf(Id.Remove(2)) == -1)
37 {
38 pengembalian salah;//Verifikasi provinsi
39 }
40 string kelahiran = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
41 Waktu TanggalWaktu = TanggalWaktu baru();
42 if (DateTime.TryParse(lahir, waktu keluar) == false)
43 {
44 return false;//Verifikasi ulang tahun
45 }
46 string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47 string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',') ;
48 karakter[] Ai = Id.Hapus(17).ToCharArray();
49 int jumlah = 0;
50 untuk (int i = 0; i < 17; i++)
51 {
52 jumlah += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
53}
54 int kamu = -1;
55 Math.DivRem(jumlah, 11, keluar y);
56 if (arrVarifyCode[y] != Id.Substring(17, 1).ToLower())
57 {
58 kembali salah;//Verifikasi kode verifikasi
59 }
60 kembali benar; //Mematuhi standar GB11643-1999
61 }
62 /// <ringkasan>
63 /// Verifikasi KTP 15 digit
64 /// </ringkasan>
65 /// <param name="Id">Nomor KTP</param>
66 /// <pengembalian></pengembalian>
67 bool pribadi CheckIDCard15 (string Id)
68 {
69 panjang n = 0;
70 if (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 kembali salah;//Verifikasi nomor
73}
74 string alamat = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 if (alamat.IndexOf(Id.Remove(2)) == -1)
76 {
77 pengembalian salah;//Verifikasi provinsi
78 }
79 string kelahiran = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
80 Waktu TanggalWaktu = TanggalWaktu baru();
81 if (DateTime.TryParse(lahir, waktu keluar) == false)
82 {
83 pengembalian salah;//Verifikasi ulang tahun
84}
85 kembali benar;//Sesuai dengan standar kartu identitas 15 digit