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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
写php分页时出现的Fatal error的解决方法
Apr 18 PHP
php中函数前加&amp;符号的作用分解
Jul 08 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
PHP批量获取网页中所有固定种子链接的方法
Nov 18 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 PHP
PHP实现文件上传后台处理脚本
Mar 04 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 SQL之where语句生成器
2009/03/24 PHP
php在线代理转向代码
2012/05/05 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
javascript实现贪吃蛇小练习
2020/07/05 Javascript
jQuery实现滑动开关效果
2020/08/02 jQuery
js 实现碰撞检测的示例
2020/10/28 Javascript
学习python (2)
2006/10/31 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
PyQt5 多窗口连接实例
2019/06/19 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
实习教师自我鉴定
2013/09/27 职场文书
高中生期末评语大全
2014/01/28 职场文书
仓库规划计划书
2014/04/28 职场文书
安全承诺书格式
2014/05/21 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
政风行风整改报告
2014/11/06 职场文书
常用的Python代码调试工具总结
2021/06/23 Python