>  기사  >  백엔드 개발  >  PHP에서 중복되지 않는 인코딩을 달성하는 방법

PHP에서 중복되지 않는 인코딩을 달성하는 방법

藏色散人
藏色散人원래의
2021-12-16 09:25:102452검색

PHP에서 중복되지 않는 인코딩을 달성하는 방법: 1. PHP 샘플 파일을 만듭니다. 2. PHP를 사용하여 16진수 변환을 수행합니다. 3. 데이터베이스를 통해 10진수를 얻고 숫자가 고유한지 확인합니다.

PHP에서 중복되지 않는 인코딩을 달성하는 방법

이 문서의 운영 환경: Windows 7 시스템, PHP 버전 7.4, Dell G3 컴퓨터.

PHP에서 중복되지 않는 인코딩을 달성하는 방법은 무엇입니까?

고유번호(반복되지 않는 36자리 숫자)를 생성하는 PHP 구현:

대량 데이터에 번호를 매기고 싶은데 숫자에 5자리 라이센스와 같이 자릿수 제한이 있는 경우 번호판 번호, 10자리 차량번호판 번호 특정 인증서 번호, 주문 일련 번호, 단축 URL 등에 대해 16진수를 사용하여 자릿수에 일치하는 고유 번호를 계산할 수 있습니다.

0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)를 사용하여 각각 0-35 값을 나타냅니다. 예를 들어 문자 Z는 35를 나타냅니다. 이 경우 5자리 숫자를 얻고 싶습니다. 최대 정보량은 36의 5제곱, 36^5 = 60466176입니다. 즉, 최대 5자리 숫자는 10진수인 60466176과 같습니다. .

본 글에서는 시연을 위해 클럽에서 10자리 멤버십 카드 번호를 일괄 발급한다고 가정합니다. 멤버십 카드 번호는 3자리 도시 번호 + 5자리 카드 번호 코드 + 2자리로 구성됩니다. 코드를 확인하세요. 도시 번호는 지역 코드로 표시됩니다. 예를 들어 5자리 카드 번호는 36자리 카드 번호로 구성됩니다. 확인의 목적은 다음과 같습니다. 코드는 카드번호의 합법성을 확인하는 것입니다. 이 경우, 당사가 생성하는 10자리 카드번호는 최대 6천만개 이상의 멤버십 카드번호에 해당하며, 중복되지 않는 고유한 카드번호입니다.

PHP 구현

우리는 PHP를 사용하여 10진수를 16진수로 변환합니다.

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; 

    } 
}

Code 클래스를 정의하고 먼저 비밀번호 사전, 즉 0-Z에 해당하는 값을 정의합니다. encodeID($int, $format) 메소드의 $int 매개변수는 숫자를 나타내고, $format은 예를 들어 encodeID(123456789, 5)는 숫자 123456789를 5자리 36자리 숫자로 변환하는 것을 의미하고, decodeID($ids) 메소드는 36자리 숫자를 10진수로 변환하는 데 사용됩니다. .

다음과 같이 카드번호를 생성할 수 있습니다:

$code = new Code(); 

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

위와 같이 5자리 카드번호를 얻을 수 있는데, 이는 실제로 카드번호 888888(68)의 회원번호를 나타내며 실제 변환은 5입니다. -숫자 : 0J1VC. 다음으로 도시 번호와 체크 코드를 추가합니다. 도시 번호가 정의되었으며, 특정 알고리즘을 통해 체크 코드를 얻습니다. 이 예에서는 처음 3개의 도시 번호와 5개의 카드를 추가하는 간단한 알고리즘을 사용합니다. 번호는 md5로 암호화되며, md5 값의 처음 두 자리를 검사 코드로 사용하여 번호 뒤의 두 자리 검사 코드를 얻습니다.

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

실제 응용에서는 데이터베이스를 통해 십진수를 얻어서 그 숫자가 고유한지 확인한 후 위의 코드를 조합하여 최종적으로 10자리의 중복되지 않는 회원카드 번호를 생성합니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP에서 중복되지 않는 인코딩을 달성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.