(Avancé) PHP génère un numéro de carte de membre unique

黄舟
Libérer: 2023-03-05 14:16:01
original
1559 Les gens l'ont consulté

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, et 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 via 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.


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(&#39;&#39;, 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; 
    } 
 
}
Copier après la connexion

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 la longueur des chiffres, 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 un nombre décimal.

Nous pouvons générer le numéro de carte comme ceci :

$code = new Code(); 
$card_no = $code->encodeID(888888,5);
Copier après la connexion

Comme ci-dessus, nous pouvons obtenir un numéro de carte à 5 chiffres, qui représente en fait le numéro de membre du numéro de carte 888888 (6 huit) , et la conversion réelle est un nombre à 5 chiffres : 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 = &#39;755&#39;; 
$card_vc = substr(md5($card_pre.$card_no),0,2); 
$card_vc = strtoupper($card_vc); 
echo $card_pre.$card_no.$card_vc;
Copier après la connexion

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. .

Rendu :

(Avancé) PHP génère un numéro de carte de membre unique

Ce qui précède explique (avancé) comment PHP génère un numéro de carte de membre unique. Pour plus de contenu connexe, veuillez faire attention au chinois PHP. site Web (www .php.cn) !


Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!