PHP实现生成唯一会员卡号


Posted in PHP onAugust 24, 2015

在不查询数据库的情况下,每个会员登录进来会生成一个数字字母组合不重复的会员卡号。

效果图如下:

PHP实现生成唯一会员卡号

当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如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常量的详解
Jun 09 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
Java中final关键字详解
Aug 10 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
利用PHPExcel实现Excel文件的写入和读取
Apr 26 PHP
php实现socket推送技术的示例
Dec 20 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
php实现session共享的实例方法
Sep 19 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 PHP
php回调函数处理数组操作示例
Apr 13 PHP
PHP实现微信发红包程序
Aug 24 #PHP
php 利用socket发送HTTP请求(GET,POST)
Aug 24 #PHP
php实现递归的三种基本方式
Jul 04 #PHP
php析构函数的简单使用说明
Aug 24 #PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 #PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 #PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 #PHP
You might like
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
谈谈PHP的输入输出流
2007/02/14 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
php读取本地json文件的实例
2018/03/07 PHP
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
C有"按引用传递"吗
2016/09/06 面试题
大学生求职简历的自我评价
2013/10/14 职场文书
军训 自我鉴定
2014/02/03 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
结婚喜宴主持词
2014/03/14 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
标准离婚协议书范文下载
2014/11/30 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
运动会表扬稿范文
2015/05/05 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers