推广程序中会使用邀请码,直接使用表id作为邀请码并不好,先实现根据id生成唯一邀请码并加密的方式提供邀请码
参考
参考链接如下:
改进
如参考方式可进行10进制转35进制进行生成邀请码,用户填写邀请码后即可通过解码(转10进制)得到用户id,但此种方式生成的邀请码依旧会存在很强的规律,容易被猜出
如:id从11到21
000b
0001
000n
000o
000p
000i
000j
0002
000r
000s
对于此可进行简单加密操作,如
function eyz_encode_open_id($user_id) {
//先转成35进制
static $source_string = 'e5fcdg3hqa4b1nopij2rstuv67mwx89klyz';
$user_id = $user_id;
$code = '';
while ( $user_id > 0) {
$mod = $user_id % 35;
$user_id = ($user_id - $mod) / 35;
$code = $source_string[$mod].$code;
}
if(empty($code[3]))
$code = str_pad($code,4,'0',str_pad_left);
return $code;
//加密
$lastchar = substr($code, -1);
$step = strpos($source_string,$lastchar) - 1 ;
$strlen = strlen($code);
for ($i=0;$i<$strlen-1;$i ){
if($step%2)
$local = strpos($source_string,$code[$i]) $step-$i;
else
$local = strpos($source_string,$code[$i]) $step $i;
if ($local < 0)
$local = 35 $local;
if($local >= 35 ){
$local = $local - 35;
}
$code[$i] = $source_string[$local];
}
return $code;
}
加密后id从11到21如下:
4b1b
b4a1
1non
n1bo
opip
poni
ij2j
jip2
2rsr
r2js
此种方式则没有可见的规律可言,也可使用此方式生成的码作为向外展示用户的唯一码
附解码函数:
function eyz_decode_open_id($code) {
static $source_string = 'e5fcdg3hqa4b1nopij2rstuv67mwx89klyz';
//解密
$lastchar = substr($code, -1);
$step = strpos($source_string,$lastchar) - 1 ;
$strlen = strlen($code);
for ($i=0;$i<$strlen-1;$i ){
if($step%2)
$local = strpos($source_string,$code[$i])-$step $i;
else
$local = strpos($source_string,$code[$i])-$step-$i;
if ($local < 0)
$local = 35 $local;
if($local >= 35 ){
$local = $local - 35;
}
$code[$i] = $source_string[$local];
}
//进制转换为10进制
if (strrpos($code, '0') !== false)
$code = substr($code, strrpos($code, '0') 1);
$len = strlen($code);
$code = strrev($code);
$num = 0;
for ($i=0; $i < $len; $i ) {
$num = strpos($source_string, $code[$i]) * pow(35, $i);
}
return $num;
}
目前评论:0