當編號位數有限(如 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 位完整卡號