Maison  >  Article  >  développement back-end  >  Comment obtenir un encodage non dupliqué en php

Comment obtenir un encodage non dupliqué en php

藏色散人
藏色散人original
2021-12-16 09:25:102498parcourir

Comment obtenir un codage non dupliqué en PHP : 1. Créez un exemple de fichier PHP ; 2. Utilisez PHP pour effectuer une conversion hexadécimale ; 3. Obtenez le nombre décimal via la base de données et assurez-vous que le nombre est unique.

Comment obtenir un encodage non dupliqué en php

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.4, ordinateur Dell G3.

Comment réaliser un encodage non dupliqué en php ?

Implémentation PHP pour générer des numéros uniques (numéros non répétitifs à 36 chiffres) :

Lorsque nous voulons numéroter une énorme donnée et que le numéro a une limite sur le nombre de chiffres, comme une licence à 5 chiffres numéro de plaque, numéro de plaque d'immatriculation à 10 chiffres Pour un certain numéro de certificat, 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 respectivement les valeurs 0-35, 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 + d'un numéro de carte à 2 chiffres. vérifier le code. 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.

Implémentation 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 = bcp($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; 

    } 
}

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);

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 5 -numéro à 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 numéros de ville et les cinq La carte. Le numéro est crypté 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.

Apprentissage 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!

Déclaration:
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