首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實作 36 進制唯一編號生成(車牌、訂單號、短網址適用)

     編輯:PHP 相關知識

當編號位數有限(如 5 位車牌、10 位證件號)且需唯一不重複時,36 進制(0-9 + A-Z)可最大化資訊容量。5 位 36 進制可容納 36⁵ = 60,466,176 組合,足應付大多數業務場景。

核心類別實作

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

    // 10 進制轉 36 進制
    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));
    }

    // 36 進制轉 10 進制
    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 = new Code();
$card_no = $code->encodeID(888888, 5); // 得到 5 位編碼:0J1VC
$card_pre = '755'; // 城市編碼(如深圳區號)
$card_vc = strtoupper(substr(md5($card_pre . $card_no), 0, 2)); // 校驗碼
echo $card_pre . $card_no . $card_vc; // 輸出 10 位完整卡號

實務應用建議

  • 資料庫自增 ID 作為 10 進制基數,保證唯一性。
  • 校驗碼演算法可依安全需求強化(如 HMAC、CRC)。
  • 適用於短網址、邀請碼、序號、追蹤單號等場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved