本文共 1833 字,大约阅读时间需要 6 分钟。
如何使用36进制生成唯一编号并验证合法性
在实际开发中,尤其是在涉及卡号、订单号、短链接等需要唯一性且有长度限制的场景时,采用36进制编码是一种有效的解决方案。36进制以0-9和A-Z为代表,共36个不同的符号,能够生成长度较长且信息密度高的编号。
以下是基于PHP语言的36进制编码实现:
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 = 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));}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类,我们可以轻松实现数字到36进制的编码转换。encodeID方法用于将给定数字转换为指定长度的36进制字符串,而decodeID方法则用于将36进制字符串转换回原来的数字。
示例:生成5位36进制卡号
$code = new Code();$card_no = $code->encodeID(888888, 5);
如上所示,encodeID方法会将输入的数字888888转换为5位的36进制字符串。最终结果会是类似于"0J1VC"这样的字符串。
卡号生成流程
校验码生成示例:
$card_pre = '755';$card_vc = substr(md5($card_pre . $card_no), 0, 2);$card_vc = strtoupper($card_vc);
最终卡号格式为:755 + 5位卡号 + 2位校验码
在实际应用中,可以将10进制数字存储在数据库中,确保唯一性,然后通过上述方法生成最终的卡号字符串。
这种方法能够生成达到6000万级别的唯一卡号,适用于需要高效唯一性验证的场景。
转载地址:http://mxtfk.baihongyu.com/