Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mencapai pengekodan bukan pendua dalam php

Bagaimana untuk mencapai pengekodan bukan pendua dalam php

藏色散人
藏色散人asal
2021-12-16 09:25:102498semak imbas

Cara mencapai pengekodan bukan pendua dalam PHP: 1. Cipta fail sampel PHP 2. Gunakan PHP untuk melakukan penukaran heksadesimal 3. Dapatkan nombor perpuluhan melalui pangkalan data dan pastikan nombor itu unik.

Bagaimana untuk mencapai pengekodan bukan pendua dalam php

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.4, komputer Dell G3.

Bagaimana untuk mencapai pengekodan bukan pendua dalam PHP?

Pelaksanaan PHP menjana nombor unik (nombor tidak berulang dalam perenambelasan):

Apabila kita ingin menomborkan data yang besar, dan nombor Terdapat digit sekatan, seperti nombor plat 5 digit, nombor ID 10 digit, nombor siri pesanan, URL pendek, dll. Kita boleh menggunakan perenambelasan untuk mengira nombor tidak berulang yang memenuhi digit.

Kami menggunakan 0-Z (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) untuk mewakili nilai masing-masing 0-35, seperti huruf Z mewakili 35. Dalam kes ini, saya ingin mendapatkan nombor 5 digit Jumlah maksimum maklumat ialah 36 dinaikkan kepada kuasa kelima, 36^5 = 60466176, iaitu, nombor 5 digit maksimum adalah bersamaan dengan nombor perpuluhan: 60466176. .

Untuk tujuan demonstrasi dalam artikel ini, kami mengandaikan bahawa kelab mengeluarkan kumpulan nombor kad keahlian 10 digit Nombor kad keahlian terdiri daripada nombor bandar 3 digit, kod nombor kad 5 digit, dan kod semakan 2 digit. Nombor bandar diwakili oleh kod kawasan Contohnya, 755 mewakili Shenzhen Nombor kad 5 digit terdiri daripada nombor kad 36 digit Dua kod semakan seterusnya dijana melalui algoritma tertentu kod adalah untuk mengesahkan kesahihan nombor kad. Dalam kes ini, nombor kad 10 digit yang kami hasilkan adalah bersamaan dengan maksimum lebih daripada 60 juta nombor kad keahlian, dan ia adalah nombor kad unik yang tidak berulang.

Pelaksanaan PHP

Kami menggunakan PHP untuk penukaran asas, daripada perpuluhan kepada perenambelasan.

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; 

    } 
}

Kami mentakrifkan kelas Kod dan mula-mula mentakrifkan kamus kata laluan, iaitu, nilai yang sepadan dengan 0-Z Parameter $int dalam kaedah encodeID($int, $format) mewakili nombor dan $format mewakili panjang digit , contohnya, encodeID(123456789,5) bermaksud menukar nombor 123456789 kepada nombor 36 digit 5 ​​digit dan kaedah decodeID($ids) digunakan untuk menukar. nombor 36 digit menjadi nombor perpuluhan.

Kita boleh menjana nombor kad seperti ini:

$code = new Code(); 

$card_no = $code->encodeID(888888,5);

Seperti di atas, kita boleh mendapatkan nombor kad 5 digit, yang sebenarnya mewakili nombor keahlian nombor kad 888888 (6 lapan), dan penukaran sebenar ialah nombor 5 digit: 0J1VC. Seterusnya, kami menambah nombor bandar dan kod semak Nombor bandar telah ditentukan, dan kod semakan diperoleh melalui algoritma tertentu Dalam contoh ini, kami menggunakan algoritma mudah: tambahkan tiga nombor bandar pertama dan lima Kad nombor adalah md5 disulitkan, dan kemudian dua digit pertama nilai md5 diambil sebagai kod semakan, supaya kod semakan dua digit selepas nombor itu diperolehi.

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

Dalam aplikasi sebenar, nombor perpuluhan boleh diperolehi melalui pangkalan data untuk memastikan nombor itu unik, dan kemudian kod di atas digabungkan untuk akhirnya menghasilkan nombor kad keahlian bukan pendua 10 digit .

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Bagaimana untuk mencapai pengekodan bukan pendua dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn