手机版

PHP实现生成唯一的会员卡号

时间:2021-09-08 来源:互联网 编辑:宝哥软件园 浏览:

不用查询数据库,每个登录的会员都会生成一个字母数字组合不重复的会员卡号。

效果图如下:

当我们要对海量的数据进行编号,而编号又受到数字的限制,比如5位车牌号码、10位证件号码、订单序列号、短网址等。我们可以使用36位系统来计算符合数字的非重复数字。

查看演示下载源代码

0-z(0123456789 abcdefghijklmnopqrstuvwxyz)分别代表数值0-35,例如字母z代表35。这种情况下,我想得到一个5位数,最大信息量是36的五次方,36 ^ 5=60466176,也就是最大5位数相当于一个十进制数:60466176。

本文中,为了演示,我们假设一个俱乐部发行了一批10位数的会员卡号,由3个城市号、5个卡号和2个校验码组成。城市号用区号表示,比如755代表深圳,5位卡号由36位卡号组成,后两个校验码由一定的算法生成,可以验证卡号的合法性。在这种情况下,我们生成的10位卡号相当于6000多万个会员卡号,是唯一不重复的卡号。

服务器端编程语言(Professional Hypertext Preprocessor的缩写)

我们用PHP把十进制转换成36。

Class Code {//密码字典private $ DIC=array (0=' 0 ',1=' 1 ',2=' 2 ',3=' 3 ',4=' 4 ',5=' 5 ',6=' 6 ',7=' 7 ',8=' 14='E ',15='F ',16='G ',17='H ',18='I ',19='J ',20='K ',21='L ',22='M ',23='N ',24='O ',25=' S '公共函数encodeID($int,$ format=8){ $ dics=$ this-DIC;$ dnum=36//二进制数$ arr=array();$ loop=truewhile($ loop){ $ arr[]=$ dics[bcmod($ int,$ dnum)];$int=bcdiv($int,$dnum,0);if($ int==' 0 '){ $ loop=false;} } if(count($ arr)$format)$ arr=arr _ 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]);//reverse $ id=strref($ 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);}返回$ v;}}我们定义Code类,首先定义密码字典,也就是分别对应0-Z的数值。encodeID方法中的参数$ int in,$format)表示数字,而$format表示数字的长度。例如,encodeID(123456789,5)表示数字123456789被转换为5位十六进制数,而方法decodeid(。

我们可以如下生成卡号:

$ Code=new Code();$card_no=$code-encodeID(888888,5);如上图,我们可以得到一个5位数的卡号,实际上代表的是一个卡号为888888(6 8)的会员号,但实际转换后,却是一个5位数:0J1VC。

然后,我们添加城市号码和校验码。城市号已经定义,校验码通过一定的算法得到。在这个例子中,我们使用了一个简单的算法:我们用md5对前三个城市号码和五位数的卡号进行加密,然后将md5值的前两位作为校验码,从而得到号码后面的两个校验码。

$ card _ pre=' 755$card_vc=substr(md5($card_pre。$card_no),0,2);$ card _ VC=strtopher($ card _ VC);echo $card_pre。$ card _ no. $ card _ vc在实际应用中,可以通过数据库获取十进制数,保证号码唯一,然后将上述代码组合,最终生成一个10位不重复的会员卡号。

版权声明:PHP实现生成唯一的会员卡号是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。