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新手谈谈我的学习心得
Feb 25 PHP
php HtmlReplace输入过滤安全函数
Jul 03 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
php中如何使对象可以像数组一样进行foreach循环
Aug 09 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
php中文繁体和简体相互转换的方法
Mar 21 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
orm获取关联表里的属性值
Apr 17 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 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中使用gettext来支持多语言的方法
2011/05/02 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
iView框架问题整理小结
2018/10/16 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python安装教程
2018/02/28 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
python数据挖掘需要学的内容
2019/06/23 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
创立科技Java面试题
2015/11/29 面试题
幼儿教师培训感言
2014/03/08 职场文书
诚信承诺书范文
2014/03/27 职场文书
护士个人总结范文
2015/02/13 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
2016年五一促销广告语
2016/01/28 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
vue实现在data里引入相对路径
2022/06/05 Vue.js
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle