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 相关文章推荐
URL Rewrite的设置方法
Jan 02 PHP
php 设计模式之 工厂模式
Dec 19 PHP
php fsockopen中多线程问题的解决办法[翻译]
Nov 09 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
PHP+MySQL删除操作实例
Jan 21 PHP
php计算函数执行时间的方法
Mar 20 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
php用户名的密码加密更安全的方法
Jun 21 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 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生成静态页面详解
2006/12/05 PHP
php checkbox 取值详细说明
2010/08/19 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
FireFox中textNode分片的问题
2007/04/10 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
Vue组件创建和传值的方法
2018/08/17 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python编写弹球游戏的实现代码
2018/03/12 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
浅析python函数式编程
2020/09/26 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
汽车驾驶求职信
2013/10/25 职场文书
保洁主管岗位职责
2013/11/20 职场文书
幼儿园家长评语
2014/02/10 职场文书
小学生元旦广播稿
2014/02/21 职场文书
销售辞职信范文
2015/03/02 职场文书
小学体育课教学反思
2016/02/16 职场文书
python简单验证码识别的实现过程
2021/06/20 Python