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生成WAP页面
Oct 09 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
Apr 15 PHP
使用正则去除php代码中的注释方法
Nov 03 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
laravel开发环境homestead搭建过程详解
Jul 03 PHP
PHP 时间处理类Carbon
May 20 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php中显示数组与对象的实现代码
2011/04/18 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
解决Mac下使用python的坑
2019/08/13 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
高中自我鉴定范文
2013/11/03 职场文书
保密承诺书
2014/03/27 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
班主任工作实习计划
2015/01/16 职场文书
《月光曲》教学反思
2016/02/16 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python