Wir verwenden 0-Z (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ), um jeweils die Werte 0-35 darzustellen, beispielsweise steht der Buchstabe Z für 35. In diesem Fall möchte ich eine 5-stellige Zahl erhalten. Die maximale Informationsmenge beträgt 36 hoch 36^5 = 60466176, d. h. die maximale 5-stellige Zahl entspricht einer Dezimalzahl: 60466176 .
Zu Demonstrationszwecken gehen wir in diesem Artikel davon aus, dass ein Club einen Stapel 10-stelliger Mitgliedskartennummern ausgibt. Die Mitgliedskartennummer besteht aus einer 3-stelligen Stadtnummer + einem 5-stelligen Kartennummerncode + ein zweistelliger Prüfcode. Die Stadtnummer wird durch die Vorwahl dargestellt. Die 5-stellige Kartennummer besteht aus einer 36-stelligen Kartennummer. Der Zweck des Schecks Der Code dient der Überprüfung der Kartennummer. In diesem Fall entspricht die von uns generierte 10-stellige Kartennummer maximal mehr als 60 Millionen Mitgliedskartennummern und ist eine eindeutige Kartennummer, die sich nicht wiederholt.
Wir verwenden PHP, um Dezimalzahlen in Hexadezimalzahlen umzuwandeln.
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; } }
Wir definieren die Code-Klasse und definieren zunächst das Passwort-Wörterbuch, also die Werte, die 0-Z entsprechen. Der Parameter $int in der Methode encodeID($int, $format) repräsentiert die Zahl, und $format stellt die Länge der Ziffern dar, zum Beispiel bedeutet encodeID(123456789,5), die Zahl 123456789 in eine 5-stellige 36-stellige Zahl umzuwandeln, und die Methode decodeID($ids) wird zum Konvertieren verwendet die 36-stellige Zahl in eine Dezimalzahl um.
Wir können die Kartennummer wie folgt generieren:
$code = new Code(); $card_no = $code->encodeID(888888,5);
Wie oben können wir eine 5-stellige Kartennummer erhalten, die tatsächlich die Mitgliedsnummer der Kartennummer 888888 darstellt (6 Achter) und die eigentliche Konvertierung ist eine 5-stellige Zahl: 0J1VC.
Als nächstes fügen wir die Stadtnummer und den Prüfcode hinzu. Die Stadtnummer wurde definiert und der Prüfcode wird durch einen bestimmten Algorithmus erhalten: Fügen Sie die ersten drei hinzu Die Stadtnummer und die fünfstellige Kartennummer werden MD5-verschlüsselt, und dann werden die ersten beiden Ziffern des MD5-Werts als Prüfcode verwendet, sodass der zweistellige Prüfcode nach der Nummer erhalten wird.
$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;
In der tatsächlichen Anwendung kann die Dezimalzahl über die Datenbank abgerufen werden, um sicherzustellen, dass die Nummer eindeutig ist. Anschließend werden die oben genannten Codes kombiniert, um schließlich eine 10-stellige, nicht doppelte Mitgliedskartennummer zu generieren .
Rendering:
Das Obige ist (erweitert), wie PHP eine eindeutige Mitgliedskartennummer generiert. Für weitere verwandte Inhalte achten Sie bitte auf PHP-Chinesisch Website (www.php.cn)!