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 相关文章推荐
追求程序速度,而不是编程的速度
Apr 23 PHP
php中的比较运算符详解
Oct 28 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
php获取发送给用户的header信息的方法
Mar 16 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 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生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
js实现筛选功能
2020/11/24 Javascript
python list转dict示例分享
2014/01/28 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
Python手机号码归属地查询代码
2016/05/04 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
软件设计的目标是什么
2016/12/04 面试题
技校生自我鉴定
2013/12/08 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
《观舞记》教学反思
2014/04/16 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书