เนื่องจากความต้องการของโครงการ ฉันจึงเขียนวิธี C# สำหรับการตรวจสอบบัตรประจำตัวตามข้อมูลออนไลน์ วิธีการนี้เขียนภายใต้ VS2005[C/S]
-
*ส่วนทางทฤษฎี:
* หมายเลขประจำตัว 15 หลัก = รหัสพื้นที่ 6 หลัก + วันเกิด 6 หลัก + หมายเลขซีเรียล 3 หลัก
* หมายเลขประจำตัว 18 หลัก = รหัสพื้นที่ 6 หลัก + วันเกิด 8 หลัก + หมายเลขซีเรียล 3 หลัก + รหัสยืนยัน 1 หลัก
-
*รหัสประเทศสองหลักแรกสำหรับแต่ละจังหวัด เมือง และภูมิภาคคือ:
* ปักกิ่ง 11 จี๋หลิน 22 ฝูเจี้ยน 35 กวางตุ้ง 44 ยูนนาน 53 เทียนจิน 12 เฮยหลงเจียง 23 เจียงซี 36 กวางสี 45 ทิเบต 54 เหอเป่ย 13 เซี่ยงไฮ้ 31 ซานตง 37 ไห่หนาน 46 ส่านซี 61 ซานซี 14 เจียงซู 32 เหอหนาน 41 ฉงชิ่ง 50
กานซู 62 มองโกเลียใน 15 เจ้อเจียง 33 หูเป่ย์ 42 เสฉวน 51 ชิงไห่ 63 เหลียวหนิง 21 อันฮุย 34 หูหนาน 43 กุ้ยโจว 52 หนิงเซี่ย 64 ซินเจียง 65 ไต้หวัน 71 ฮ่องกง 81 มาเก๊า 82 ต่างประเทศ 91
*มาตรฐานบัตรประจำตัวประชาชน 18 หลักมีการกำหนดไว้อย่างชัดเจนใน GB11643-1999 "หมายเลขประจำตัวประชาชน" ที่ดำเนินการโดยหน่วยงานกำกับดูแลคุณภาพและเทคนิคแห่งรัฐเมื่อวันที่ 1 กรกฎาคม 1999
*GB11643-1999 "หมายเลขประจำตัวประชาชน" เป็นเวอร์ชันแก้ไขของ GB11643-1989 "หมายเลขประกันสังคม" ซึ่งระบุว่าชื่อมาตรฐานเดิม "หมายเลขประกันสังคม" จะถูกเปลี่ยนชื่อเป็น "หมายเลขประจำตัวประชาชน" นอกจากนี้ GB11643-1999 "หมายเลขประจำตัวประชาชน" จะแทนที่ GB11643-1989 นับจากวันที่ดำเนินการ
*หมายเลขประจำตัวประชาชนเป็นรหัสผสมที่มีลักษณะเฉพาะ ซึ่งประกอบด้วยรหัสร่างกายสิบเจ็ดหลักและรหัสตรวจสอบหนึ่งหลัก ลำดับจากซ้ายไปขวาคือ รหัสที่อยู่หกหลัก รหัสวันเกิดแปดหลัก รหัสลำดับสามหลัก และรหัสตรวจสอบหนึ่งหลัก ความหมายของมันเป็นดังนี้:
*1. รหัสที่อยู่: ระบุรหัสฝ่ายบริหารของเทศมณฑล (เมือง แบนเนอร์ เขต) ซึ่งเป็นที่ตั้งของที่อยู่ถาวรของวัตถุการเข้ารหัส และดำเนินการตามข้อกำหนดของ GB/T2260
*2. รหัสวันเกิด: ระบุปี เดือน และวันเดือนปีเกิดของวัตถุการเข้ารหัส ซึ่งเป็นไปตามข้อกำหนดของ GB/T7408 2 หลัก และ 2 หลักตามลำดับ โดยไม่มีตัวคั่นระหว่างกัน
*3. รหัสลำดับ: ระบุหมายเลขลำดับที่กำหนดให้กับบุคคลที่เกิดในปีเดียวกัน เดือนเดียวกัน และวันเดียวกันภายในพื้นที่ที่ระบุด้วยรหัสที่อยู่เดียวกัน มอบหมายให้ผู้หญิง
*วิธีคำนวณการตรวจสอบ:
*1. ผลรวมถ่วงน้ำหนักของรหัส Ontology 17 หลัก
*สูตรคือ: S = Sum(Ai * Wi), i = 0, ... , 16
*โดยที่ Ai แทนค่าดิจิทัลของหมายเลขบัตรประจำตัวประชาชนที่ตำแหน่ง i-th, Wi แทนค่าปัจจัยถ่วงน้ำหนักที่ตำแหน่ง i-th และค่าที่สอดคล้องกันคือ:
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2. รับผลการคำนวณแบบโมดูโล 11
*Y = ม็อด(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
-
รหัส
1 /// <สรุป>
2 /// การตรวจสอบบัตรประจำตัวประชาชน
3 /// </สรุป>
4 /// <param name="Id">หมายเลขบัตรประจำตัวประชาชน</param>
5 /// <ส่งคืน></ส่งคืน>
6 CheckIDCard บูลสาธารณะ (รหัสสตริง)
7 {
8 ถ้า (Id.Length == 18)
9 {
10 บูลตรวจสอบ = CheckIDCard18(Id);
11 เช็คคืน;
12}
13 อื่นถ้า (Id.Length == 15)
14 {
15 บูลตรวจสอบ = CheckIDCard15(Id);
16 เช็คคืน;
17}
18 อื่น ๆ
19 {
20 กลับเท็จ;
ยี่สิบเอ็ด }
ยี่สิบสอง }
23 /// <สรุป>
24 /// ยืนยันบัตรประจำตัวประชาชน 18 หลัก
25 /// </สรุป>
26 /// <param name="Id">หมายเลขบัตรประจำตัวประชาชน</param>
27 /// <ส่งคืน></ส่งคืน>
28 บูลส่วนตัว CheckIDCard18 (รหัสสตริง)
29 {
30 ยาว n = 0;
31 if (long.TryParse(Id.Remove(17), ออก n) == false || n < Math.Pow(10, 16) || long.TryParse(Id.Replace('x', '0') .Replace('X', '0'), ออก n) == false)
32 {
33 กลับเท็จ;//การตรวจสอบหมายเลข
34}
ที่อยู่สตริง 35 รายการ = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36 ถ้า (address.IndexOf(Id.Remove(2)) == -1)
37 {
38 คืนค่าเท็จ;//การตรวจสอบจังหวัด
39 }
40 สตริงเกิด = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
41 DateTime เวลา = DateTime ใหม่ ();
42 ถ้า (DateTime.TryParse (เกิด, หมดเวลา) == false)
43 {
44 กลับเท็จ;//การตรวจสอบวันเกิด
45 }
46 string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").แยก(',');
47 สตริง[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").แยก(',') ;
48 อักขระ[] Ai = Id.Remove(17).ToCharArray();
49 จำนวนเต็ม = 0;
50 สำหรับ (int i = 0; i < 17; i++)
51 {
52 ผลรวม += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
53}
54 int y = -1;
55 Math.DivRem(ผลรวม, 11, ออก y);
56 ถ้า (arrVarifyCode[y] != Id.Substring(17, 1).ToLower())
57 {
58 คืนค่าเท็จ // การยืนยันรหัสยืนยัน
59 }
60 คืนค่าจริง // สอดคล้องกับมาตรฐาน GB11643-1999
61 }
62 /// <สรุป>
63 /// การยืนยันบัตรประจำตัวประชาชน 15 หลัก
64 /// </สรุป>
65 /// <param name="Id">หมายเลขบัตรประจำตัวประชาชน</param>
66 /// <ส่งคืน></ส่งคืน>
67 บูลส่วนตัว CheckIDCard15 (รหัสสตริง)
68 {
69 ยาว n = 0;
70 if (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 กลับเท็จ;//การตรวจสอบหมายเลข
73}
ที่อยู่สตริง 74 = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 ถ้า (address.IndexOf(Id.Remove(2)) == -1)
76 {
77 คืนค่าเท็จ;//การตรวจสอบจังหวัด
78 }
79 สตริงเกิด = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
80 DateTime time = DateTime ใหม่ ();
81 ถ้า (DateTime.TryParse (เกิด, หมดเวลา) == false)
82 {
83 คืนค่าเท็จ;//การยืนยันวันเกิด
84}
85 return true;//เป็นไปตามมาตรฐานบัตรประจำตัวประชาชน 15 หลัก