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 相关文章推荐
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
smarty内置函数capture用法分析
Jan 22 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 PHP
再Docker中架设完整的WordPress站点全攻略
Jul 29 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
Mar 17 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
Sep 26 PHP
基于php实现的验证码小程序
Dec 13 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
php redis setnx分布式锁简单原理解析
Oct 23 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
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
js实现html滑动图片拼图验证
2020/06/24 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
酒店人事专员岗位职责
2013/12/19 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
八年级语文教学反思
2016/03/03 职场文书