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 array_search() 函数使用
Apr 13 PHP
PHP定时自动生成静态HTML的实现代码
Jun 20 PHP
php小型企业库存管理系统的设计与实现代码
May 16 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
Dec 09 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
9个比较实用的php代码片段
Mar 15 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
PHP fprintf()函数用法讲解
Feb 16 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分页示例代码
2007/03/19 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP header函数分析详解
2011/08/06 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
javascript 节点遍历函数
2010/03/28 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
python中bisect模块用法实例
2014/09/25 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python探索之创建二叉树
2017/10/25 Python
tensorflow识别自己手写数字
2018/03/14 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
Python操作MySQL数据库的方法
2018/06/20 Python
比较一下entity bean和session bean
2013/12/27 面试题
会计专业毕业生自荐信范文
2013/12/20 职场文书
玩具公司的创业计划书
2013/12/31 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
一起来学习Python的元组和列表
2022/03/13 Python