Cet article présente principalement PHP pour implémenter l'exemple de code de validation du numéro d'identification de citoyen chinois, qui peut déterminer l'exactitude du numéro d'identification et est d'une grande valeur pratique
Cet article utilisera Java pour implémenter le Citoyen chinois (15 ou 18 chiffres), les fonctions sont les suivantes :
Vérification de la validité du numéro de carte d'identité
Analyser les informations détaillées de la carte d'identité
Analyser les informations détaillées de la carte d'identité
Vérification du numéro de carte d'identité
Structure du numéro Le numéro d'identité du citoyen est un code combiné caractéristique, composé de dix-sept-. code corporel à chiffres et un code de contrôle. L'ordre de gauche à droite est le suivant : code d'adresse à six chiffres, code de date de naissance à huit chiffres, code de séquence à trois chiffres et code de contrôle à un chiffre.
2. Code d'adresse (six premiers chiffres)
indique le code de division administrative du comté (ville, bannière, district) où se trouve la résidence permanente de l'objet de codage , en GB/ Les dispositions du T2260 sont mises en œuvre.
3. Code de date de naissance (septième à quatorzième chiffres)
indique l'année, le mois et le jour de naissance de l'objet de codage, et doit être mis en œuvre conformément avec les dispositions du GB/T7408, aucun séparateur n'est utilisé entre les codes de l'année, du mois et du jour.
4. Code de séquence (15ème au 17ème chiffre)
signifie que dans la zone identifiée par le même code d'adresse, la même année, le même mois, le même Les personnes nées le même jour se voient attribuer des numéros de série, les numéros impairs étant attribués aux hommes et les numéros pairs aux femmes.
5. Code de vérification (dix-huitième chiffre)
(1) Formule de sommation pondérée du code d'ontologie à dix-sept chiffres S = Somme (Ai * Wi ), i = 0, …, 16, additionnez d'abord les poids des 17 premiers chiffres
Ai : représente la valeur numérique du numéro d'identification à la i-ième position
Wi : représente le facteur de pondération Wi à la i-ème position : 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2) Calculer le module Y = mod(S, 11)
(3) Obtenez le code de contrôle Y correspondant via le module : 0 1 2 3 4 5 6 7 8 9 10 Code de contrôle : 1 0 X 9 8 7 6 5 4 3 2
<?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); } }
<?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"));
Méthode simple php pour restaurer des URL courtes (liens courts) (disponibles pour les tests)_astuces php
Version chinoise des bases de la spécification PSR_php
Test
pour se connecter à MYSQL Code pour le succès ou l'échec_php bases
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!