1

很多app会有一个,邀请新用户,自己获得奖励的机制。
通过userid 生成每个用户的唯一邀请码,通过这个邀请码进来的用户,就可以带给自己奖励
其原理就是

十进制转换 更大进制

一. 最原始的邀请码

可以用自己的 userid

缺点是暴露了自己的userid,以及很多userid是十进制,有可能太长

二. 最方便的邀请码生成方式

把十进制转换成 十六进制(或其他进制函数base_convert)
base_convert(string $number, int $frombase , int $tobase)
$number 原始数据
$frombase 原始数据的 进制格式 (2 和 36 之间)
$tobase to进制格式 (2 和 36 之间)
//0-9 a-z(代表10-35)
base_convert(102023, 10 , 10);// 102023 (10进制)
base_convert(102023, 10 , 16);// 18e87 (16进制)
base_convert(102023, 10 , 36);// 26pz (36进制)

三.base_convert原理

//简单实现一个 10 转 16进制的函数
function my_base_convert($int,$from = 10,$to = 16){
    $bases = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];//代表0-15
    $toValue = '';
    $shang = $int;
    do{
        $yu = $shang % 16 ;
        $shang = floor($shang / 16) ;
        $toValue = $bases[$yu].$toValue;
    }while($shang > 0);
    return $toValue;
}
base_convert(102023, 10 , 16);// 18e87 (16进制)
my_base_convert(102023,10,16);// 18e87 (16进制)

四.有没有代替的方式?

base_convert的进制方式,是有顺序的,容易被人反向解析到 userid
有没有我们自己实现一个类似的base_convert,,不过是无序的?
function my_base_convert($int,$from = 10,$to = 16){
    $bases = ['a','b','0','1','2','3','4','7','8','9','c','d','e','f','5','6'];//代表0-15
    $toValue = '';
    $shang = $int;
    do{
        $yu = $shang % 16 ;
        $shang = floor($shang / 16) ;
        $toValue = $bases[$yu].$toValue;
    }while($shang > 0);
    return $toValue;
}
my_base_convert(102023,10,16);// b8587 (无序16进制)

五.更大的无序进制转换

只需要把 $bases 放大就行

谢谢您的观看,欢迎关注我的公众号。

image.png


海生
104 声望34 粉丝

与黑夜里,追求那一抹萤火。