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错误、异常处理机制(补充)
May 07 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
解析php中const与define的应用区别
Jun 18 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
Jun 23 PHP
PHP简单日历实现方法
Jul 20 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
php和C#的yield迭代器实现方法对比分析
Jul 17 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
Feb 27 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导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
简单介绍Python中的JSON模块
2015/04/08 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
详解python调用cmd命令三种方法
2019/07/08 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
"引用"与指针的区别是什么
2016/09/07 面试题
C#软件工程师英语面试题
2015/06/07 面试题
军训自我鉴定100字
2014/02/13 职场文书
行政专员的岗位职责
2014/03/10 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
安全教育月活动总结
2014/05/05 职场文书
中秋手机店促销方案
2014/06/16 职场文书
社区两委对照检查材料
2014/08/23 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
教师学期末个人总结
2015/02/13 职场文书
2015年少先队活动总结
2015/03/25 职场文书