PHP实现生成唯一编号(36进制的不重复编号)


Posted in PHP onJuly 01, 2014

当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号、10位的某证件号码、订单流水号、短网址等等,我们可以使用36进制计算出符合位数的不重复的编号。

我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35。这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 = 60466176,即最大的5位编号相当于10进制的数字:60466176。
本文中为了做演示,我们假定某俱乐部发放一批10位的会员卡号,会员卡号由3位城市编号+5位卡号编码+2位校验码组成。城市编号用区号表示,如755代表深圳,5位卡编号则由36进制的卡编号组成,后面两位校验码则是通过一定的算法生成的,校验码的用处是可以验证卡号的合法性。这样的话,我们生成的10位卡号相当于最大能满足6000多万会员卡号,并且是不重复唯一的卡号。

PHP实现

我们使用PHP进行进制转换,10进制转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类,先定义密码字典,即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(6个8)的会员编号,而实际进行转换后是5位编号:0J1VC。
接着,我们将城市编号和校验码加上,城市编号是已经定义好的,校验码则通过一定的算法取得,本例中,我们使用简单的算法:将前三位城市编号和五位卡编号进行md5加密,然后取md5值的前2位作为校验码,这样就得到了编号后面的两位校验码。

$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进制的编号,保证编号唯一,再将上述代码组合,最终生成一个10位的不重复的会员卡号。

PHP 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
PHP 存取 MySQL 数据库的一个例子
Oct 09 PHP
php仿discuz分页效果代码
Oct 02 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
试用php中oci8扩展
Jun 18 PHP
php比较两个字符串长度的方法
Jul 13 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
详解Laravel制作API接口
May 31 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 #PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 #PHP
ThinkPHP模板IF标签用法详解
Jul 01 #PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 #PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 #PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 #PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 #PHP
You might like
使用PHP提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
js变换显示图片的实例
2013/04/16 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
python多线程编程方式分析示例详解
2013/12/06 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
详解Python中的type和object
2018/08/15 Python
python中cPickle类使用方法详解
2018/08/27 Python
python将数组n等分的实例
2019/12/02 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
现役军人家属慰问信
2015/03/24 职场文书
工作态度检讨书范文
2015/05/06 职场文书
地球上的星星观后感
2015/06/02 职场文书
葬礼主持词
2015/07/02 职场文书
护士心得体会范文
2016/01/25 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers