当我们要大量的数据,而数字的数量是有限的,如车牌号码,5位10位ID号,订单号,短网址等,我们可以使用36十六进制数字计算的次数不重复。

我们代表0-z(0123456789abcdefghijklmnopqrstuvwxyz)值分别为0,如字母Z为35。在这种情况下,我想得到一个5位数的号码。最大信息是36, 36×5=60466176的5倍,也就是说,最大的5位数等于10位数:60466176。

为了做陈述,我们假设一个俱乐部将发行一批10张会员卡号。会员卡号码由3个城市号码、5位卡和+ 2位校验码组成,区号用区号表示。如果755代表深圳,5位数的卡号由36个二进制卡号组成。两位校验码是由一定的算法生成的。检查码的目的是验证卡号的有效性。这样,我们生成的10位数字相当于达到大约60000000个成员卡号的最大值,而不是唯一不重复的卡号。

PHP实现

我们使用PHP进行转换,10到36。

复制代码代码如下所示:

类代码{

密码字典

私人美元=阵列(DIC

0 = 1 = > > 0,1,2 = 3 = > > 2',3',4 = 5 = > > 4,5,6 = 7 = > > 6,7',8 = > 8,

9 = > 9,10 = 11 = > > A、B、C 12 = >,13 = >会',14 = 15 = > > e、f、g 16 = >,17 = > H,

18 = 19 = > >我,J,20 = > k,21 = 22 = > > '我',是',23 = n = > >,24 O,25 = 26 = > > 'p',Q,

27 = > R,28 = 29 = > >的'不',30 = 31 = > > U,V,32 = >'w',33 = 34 = > > x,Y,Z 35 = >

);





公共功能encodeid($ int格式= 8美元){

$盘=美元-> DIC;

美元 / dNum转换= 36;/十六进制数

($ ARR =阵);

$循环=真;

当($循环){

$ ARR { } = { bcmod 3美元($ int,$ dNum转换)};

美元($ int,int = bcdiv dNum转换美元,0);

如果($ int = = '0'){

$循环= false;

}

}

如果(计数($ ARR)< $格式)

array_pad(ARR ARR为美元美元美元美元,格式,光盘{ 0 });



返回崩溃('',array_reverse($ ARR));

}



公共功能decodeid($ IDS){

$盘=美元-> DIC;

美元 / dNum转换= 36;/十六进制数

密钥交换

本公司为array_flip美元($盘);

为零

美元($ id,id = LTrim美元盘{ 0 });

反转

$id = strrev($id);

$ = 0;

为($我= 0,J = strlen($id);美元美元美元我<< J;i++){

$ V = bcadd(bcmul($本公司{ $id {)

$我}

},bcpow($ dNum转换,我美元,0),0美元),V,0);

}

返回$;

}



}



我们定义了一个代码的类,定义密码字典,对应于0-z数值方法,encodeid($ int,int,美元美元格式)中的参数数量,为格式的数字的长度,如encodeid(123456789,5)123456789号为36位5进制数表示,并decodeid方法($ IDS)36进制数转换成10进制数。

我们可以用这种方法创建一个卡号:

复制代码代码如下所示:

$ =新代码();

card_no美元=美元代码-> encodeid(888888 ,5);



如上所述,我们可以得到一个5位数的卡号,这实际上代表了卡号的会员数是888888(6的8),与实际的转换为5位:0j1vc。

然后,我们将定义城市号码和校验加市数字,校验码是通过一定的算法,在这种情况下,我们使用简单的算法:排名前三的城市数量和五位MD5加密的信用卡号码,然后把前2的MD5值检查代码,这样就得到了两位奇偶校验码的数字背后。

复制代码代码如下所示:

card_pre美元= '755;

card_vc美元= substr(MD5(card_pre美元。美元card_no),0,2);

card_vc = strtoupper美元(美元card_vc);

回声card_pre美元。card_no card_vc美元美元;



在实际应用中,可以通过数据库获得10十六进制数,以确保该数字是唯一的。然后将上面的代码合并生成一个10位的非重复的会员卡号码。