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模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
PHP图片验证码制作实现分享(全)
May 10 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
PHP中数据库单例模式的实现代码分享
Aug 21 PHP
smarty简单分页的实现方法
Oct 27 PHP
php使用PDO方法详解
Dec 27 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
试用php中oci8扩展
Jun 18 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP简单计算两个时间差的方法示例
Jun 20 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
禁止直接访问php文件代码分享
May 05 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代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
JS版网站风格切换实例代码
2008/10/06 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
python 随机数生成的代码的详细分析
2011/05/15 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
python中的decorator的作用详解
2018/07/26 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
大学生自我鉴定
2013/12/08 职场文书
公司员工活动策划方案
2014/08/20 职场文书
小学运动会演讲稿
2014/08/25 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
python实现三次密码验证的示例
2021/04/29 Python
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB