博客
关于我
PHP生成唯一不重复的编号
阅读量:798 次
发布时间:2023-03-01

本文共 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"这样的字符串。

卡号生成流程

  • 城市编号:例如755代表深圳
  • 卡号编码:使用encodeID生成5位36进制字符串
  • 校验码:通过特定算法生成,比如MD5加密
  • 校验码生成示例:

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

    你可能感兴趣的文章