In diesem Artikel wird hauptsächlich PHP zur Implementierung des Beispielcodes zur Validierung der chinesischen Bürger-ID-Nummer vorgestellt, der die Richtigkeit der ID-Nummer bestimmen kann und von großem praktischen Wert ist.
In diesem Artikel wird Java zur Implementierung verwendet Chinesischer Staatsbürger (15 oder 18 Ziffern), die Funktionen sind wie folgt:
Überprüfung der Gültigkeit der ID-Kartennummer
Detaillierte ID-Karteninformationen analysieren
Generieren Sie eine virtuelle Provinzzertifikatsnummer.
Überprüfung der Personalausweisnummer
1 Zahlenstruktur Die Bürgeridentitätsnummer ist ein charakteristischer Kombinationscode, bestehend aus siebzehn. Ziffernkörpercode und ein Prüfcode. Die Reihenfolge von links nach rechts lautet: sechsstelliger Adresscode, achtstelliger Geburtsdatumscode, dreistelliger Sequenzcode und einstelliger Prüfcode.
2. Adresscode (erste sechs Ziffern)
gibt den Verwaltungsbezirkscode des Kreises (Stadt, Banner, Bezirk) an, in dem sich der ständige Wohnsitz des Kodierungsobjekts befindet , in GB/ Die Bestimmungen von T2260 werden umgesetzt.
3. Geburtsdatumscode (siebte bis vierzehnte Ziffer)
gibt das Jahr, den Monat und den Tag der Geburt des Kodierungsobjekts an und muss entsprechend implementiert werden Gemäß den Bestimmungen von GB/T7408 werden keine Trennzeichen zwischen Jahres-, Monats- und Tagescodes verwendet.
4. Sequenzcode (15. bis 17. Ziffer)
bedeutet, dass innerhalb des Gebiets der gleiche Adresscode, das gleiche Jahr, der gleiche Monat, derselbe gilt Personen, die am selben Tag geboren wurden, erhalten fortlaufende Nummern, wobei Männern ungerade Nummern und Frauen gerade Nummern zugewiesen werden.
5. Prüfcode (achtzehnte Ziffer)
(1) Siebzehnstellige Ontologiecode-gewichtete Summationsformel S = Summe(Ai * Wi), i = 0, …, 16, summieren Sie zuerst die Gewichte der ersten 17 Ziffern
Ai: stellt den digitalen Wert der ID-Nummer an der i-ten Position dar
Wi: stellt dar der Gewichtungsfaktor Wi an der i-ten Position: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2) Berechnen Sie Modul Y = mod(S, 11)
(3) Erhalten Sie den entsprechenden Prüfcode Y über das Modul: 0 1 2 3 4 5 6 7 8 9 10 Prüfcode: 1 0 X 9 8 7 6 5 4 3 2
IDValidator.php
<?php namespace com\jdk5\blog\IDValidator; class IDValidator { private static $GB2260; private static $instance; private static $cache = array(); private static $util; function __construct() { if (!class_exists("com\jdk5\blog\IDValidator\GB2260")){ include 'GB2260.php'; } if (!class_exists("com\jdk5\blog\IDValidator\util")){ include 'util.php'; } self::$GB2260 = GB2260::getGB2260 (); self::$util = util::getInstance(); } public static function getInstance() { if (is_null ( self::$instance )) { self::$instance = new IDValidator (); } return self::$instance; } function isValid($id) { $code = self::$util->checkArg ( $id ); if ($code === false) { return false; } // 查询cache if (isset ( self::$cache [ $id ] ) && self::$cache [$id] ['valid'] !== false) { return self::$cache [$id] ['valid']; } else { if (! isset ( self::$cache [ $id ] )) { self::$cache [$id] = array (); } } $addr = substr ( $code ['body'], 0, 6 ); $birth = $code ['type'] === 18 ? substr ( $code ['body'], 6, 8 ) : substr ( $code ['body'], 6, 6 ); $order = substr ( $code ['body'], - 3 ); if (! (self::$util->checkAddr ( $addr ) && self::$util->checkBirth ( $birth ) && self::$util->checkOrder ( $order ))) { self::$cache [$id] ['valid'] = false; return false; } // 15位不含校验码,到此已结束 if ($code ['type'] === 15) { self::$cache [$id] ['valid'] = true; return true; } /* 校验位部分 */ // 位置加权 $posWeight = array (); for($i = 18; $i > 1; $i --) { $wei = self::$util->weight ( $i ); $posWeight [$i] = $wei; } // 累加body部分与位置加权的积 $bodySum = 0; $bodyArr = str_split( $code ['body'] ); for($j = 0; $j < count ( $bodyArr ); $j ++) { $bodySum += (intval ( $bodyArr [$j], 10 ) * $posWeight [18 - $j]); } // 得出校验码 $checkBit = 12 - ($bodySum % 11); if ($checkBit == 10) { $checkBit = 'X'; } else if ($checkBit > 10) { $checkBit = $checkBit % 11; } // 检查校验码 if ($checkBit != $code ['checkBit']) { self::$cache [$id] ['valid'] = false; return false; } else { self::$cache [$id] ['valid'] = true; return true; } } // 分析详细信息 function getInfo ($id) { // 号码必须有效 if ($this->isValid($id) === false) { return false; } // TODO 复用此部分 $code = self::$util->checkArg($id); // 查询cache // 到此时通过isValid已经有了cache记录 if (isset(self::$cache[$id]) && isset(self::$cache[$id]['info'])) { return self::$cache[$id]['info']; } $addr = substr($code['body'], 0, 6); $birth = ($code['type'] === 18 ? substr($code['body'], 6, 8) : substr($code['body'], 6, 6)); $order = substr($code['body'], -3); $info = array(); $info['addrCode'] = $addr; if (self::$GB2260 !== null) { $info['addr'] = self::$util->getAddrInfo($addr); } $info ['birth'] = ($code ['type'] === 18 ? (substr ( $birth, 0, 4 ) . '-' . substr ( $birth, 4, 2 ) . '-' . substr ( $birth, - 2 )) : ('19' . substr ( $birth, 0, 2 ) . '-' . substr ( $birth, 2, 2 ) . '-' . substr ( $birth, - 2 ))); $info['sex'] = ($order % 2 === 0 ? 0 : 1); $info['length'] = $code['type']; if ($code['type'] === 18) { $info['checkBit'] = $code['checkBit']; } // 记录cache self::$cache[$id]['info'] = $info; return $info; } // 仿造一个号 function makeID ($isFifteen=false) { // 地址码 $addr = null; if (self::$GB2260 !== null) { $loopCnt = 0; while ($addr === null) { // 防止死循环 if ($loopCnt > 50) { $addr = 110101; break; } $prov = self::$util->str_pad(self::$util->rand(66), 2, '0'); $city = self::$util->str_pad(self::$util->rand(20), 2, '0'); $area = self::$util->str_pad(self::$util->rand(20), 2, '0'); $addrTest = $prov . $city . $area; if (isset(self::$GB2260[$addrTest])) { $addr = $addrTest; break; } $loopCnt ++; } } else { $addr = 110101; } // 出生年 $yr = self::$util->str_pad(self::$util->rand(99, 50), 2, '0'); $mo = self::$util->str_pad(self::$util->rand(12, 1), 2, '0'); $da = self::$util->str_pad(self::$util->rand(28, 1), 2, '0'); if ($isFifteen) { return $addr . $yr . $mo . $da . self::$util->str_pad(self::$util->rand(999, 1), 3, '1'); } $yr = '19' . $yr; $body = $addr . $yr . $mo . $da . self::$util->str_pad(self::$util->rand(999, 1), 3, '1'); // 位置加权 $posWeight = array(); for ($i = 18; $i > 1; $i--) { $wei = self::$util->weight($i); $posWeight[$i] = $wei; } // 累加body部分与位置加权的积 $bodySum = 0; $bodyArr = str_split($body); for ($j = 0; $j < count($bodyArr); $j++) { $bodySum += (intval($bodyArr[$j], 10) * $posWeight[18 - $j]); } // 得出校验码 $checkBit = 12 - ($bodySum % 11); if ($checkBit == 10) { $checkBit = 'X'; } else if ($checkBit > 10) { $checkBit = $checkBit % 11; } return ($body . $checkBit); } }
Anruf
<?php header("Content-type: text/html; charset=utf-8"); include 'IDValidator.php'; $v = com\jdk5\blog\IDValidator\IDValidator::getInstance(); //生成一个18位身份证号 $id = $v->makeID(); //获取身份证信息 $info = $v->getInfo($id); var_dump($info); //生成一个15位身份证号 $id = $v->makeID(true); $info = $v->getInfo($id); var_dump($info); //验证身份证号是否正确 var_dump($v->isValid("123456789012345678"));
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.
Verwandte Empfehlungen:
Einfache PHP-Methode zum Wiederherstellen kurzer URLs (Kurzlinks) (zum Testen verfügbar)_php-Tipps
PHP Chinesische Version der PSR-Spezifikation_php-Grundlagen
Das obige ist der detaillierte Inhalt vonPHP-Methode zur Implementierung der Gültigkeitsüberprüfung der chinesischen Bürger-ID-Nummer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!