Maison > Article > développement back-end > php génère un numéro de membre unique
Sans interroger la base de données, chaque membre qui se connectera générera un numéro de carte de membre avec une combinaison unique de chiffres et de lettres.
Le rendu est le suivant :
Quand on veut numéroter une donnée énorme, et que la numérotation a une limite sur la nombre de chiffres, par exemple un numéro de plaque d'immatriculation à 5 chiffres, un numéro de document à 10 chiffres, un numéro de série de commande, une URL courte, etc., nous pouvons utiliser l'hexadécimal pour calculer un numéro unique qui correspond au nombre de chiffres.
Nous utilisons 0-Z (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) pour représenter les valeurs 0-35 respectivement, comme la lettre Z représentant 35. Dans ce cas, je souhaite obtenir un nombre à 5 chiffres. La quantité maximale d'informations est de 36 élevée à la puissance cinq, 36^5 = 60466176, c'est-à-dire que le nombre maximum à 5 chiffres équivaut à un nombre décimal : 60466176. .
À des fins de démonstration dans cet article, nous supposons qu'un club émet un lot de numéros de carte de membre à 10 chiffres. Le numéro de carte de membre se compose d'un numéro de ville à 3 chiffres + d'un code de numéro de carte à 5 chiffres +. un code de chèque à 2 chiffres. Le numéro de ville est représenté par l'indicatif régional. Par exemple, 755 représente Shenzhen. Le numéro de carte à 5 chiffres est composé d'un numéro de carte à 36 chiffres. Les deux codes de contrôle suivants sont générés par un certain algorithme. Le code sert à vérifier la légalité du numéro de carte. Dans ce cas, le numéro de carte à 10 chiffres que nous générons équivaut à un maximum de plus de 60 millions de numéros de carte de membre, et c'est un numéro de carte unique qui ne se répète pas.
PHP
Nous utilisons PHP pour convertir le décimal en hexadécimal.
class Code { //密码字典 private $dic = array( 0=>'0', 1=>'1', 2=>'2', 3=>'3', 4=>'4', 5=>'5', 6=>'6', 7=>'7', 8=>'8', 9=>'9', 10=>'A', 11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F', 16=>'G', 17=>'H', 18=>'I',19=>'J', 20=>'K', 21=>'L', 22=>'M', 23=>'N', 24=>'O', 25=>'P', 26=>'Q', 27=>'R',28=>'S', 29=>'T', 30=>'U', 31=>'V', 32=>'W', 33=>'X', 34=>'Y', 35=>'Z' ); public function encodeID($int, $format=8) { $dics = $this->dic; $dnum = 36; //进制数 $arr = array (); $loop = true; while ($loop) { $arr[] = $dics[bcmod($int, $dnum)]; $int = bcdiv($int, $dnum, 0); if ($int == '0') { $loop = false; } } if (count($arr) < $format) $arr = array_pad($arr, $format, $dics[0]); return implode('', array_reverse($arr)); } public function decodeID($ids) { $dics = $this->dic; $dnum = 36; //进制数 //键值交换 $dedic = array_flip($dics); //去零 $id = ltrim($ids, $dics[0]); //反转 $id = strrev($id); $v = 0; for ($i = 0, $j = strlen($id); $i < $j; $i++) { $v = bcadd(bcmul($dedic[$id { $i } ], bcpow($dnum, $i, 0), 0), $v, 0); } return $v; } }
Nous définissons la classe Code et définissons d'abord le dictionnaire de mots de passe, c'est-à-dire les valeurs correspondant à 0-Z Le paramètre $int dans la méthode encodeID($int, $format) représente le nombre et $format représente le nombre de chiffres. Longueur, par exemple, encodeID(123456789,5) signifie convertir le nombre 123456789 en un nombre à 5 chiffres à 36 chiffres, et la méthode decodeID($ids) est utilisée pour convertir le nombre à 36 chiffres en nombre décimal.
Nous pouvons générer le numéro de carte comme ceci :
$code = new Code(); $card_no = $code->encodeID(888888,5);
Comme ci-dessus, nous pouvons obtenir un numéro de carte à 5 chiffres, ce qui signifie en fait que le numéro de carte est 888888 (6 huit) Le numéro de membre est en réalité un numéro à 5 chiffres après conversion : 0J1VC.
Ensuite, nous ajoutons le numéro de ville et le code de contrôle. Le numéro de ville a été défini, et le code de contrôle est obtenu grâce à un certain algorithme. Dans cet exemple, nous utilisons un algorithme simple : ajoutez les trois premiers. le numéro de ville et le numéro de carte à cinq chiffres sont cryptés md5, puis les deux premiers chiffres de la valeur md5 sont pris comme code de contrôle, de sorte que le code de contrôle à deux chiffres après le numéro soit obtenu.
$card_pre = '755'; $card_vc = substr(md5($card_pre.$card_no),0,2); $card_vc = strtoupper($card_vc); echo $card_pre.$card_no.$card_vc;
Dans l'application réelle, le nombre décimal peut être obtenu via la base de données pour garantir que le numéro est unique, puis les codes ci-dessus sont combinés pour finalement générer un numéro de carte de membre non dupliqué à 10 chiffres.
Le contenu ci-dessus est à titre de référence uniquement !
Tutoriel recommandé : Tutoriel vidéo PHP
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!