PHP根据用户ID生成唯一的邀请码

  • A+
所属分类:PHP

在开发中,我们可能会遇到需要生成用户唯一的邀请码,来做一些邀请活动,接下来,我们思考如何生成唯一的邀请码,且可以根据邀请码获取到用户id。

首先,我们可以考虑使用用户user_id 来生成邀请码,并生成一个随机的字符串,将user_id 插入到字符串的某个特定位置,但是这样user_id十分容易暴露,因此我们考虑使用字母(A-Z)和数字(0-9)来生成邀请码。

由于A-Z以及0-9共有 36个字符,因为将user_id 转换为 36进制即可。

如下:

function createCode($user_id)
{
    $sourceString= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $num = $user_id;
    $code = '';
    while($num)
    {
        $mod = $num % 36; 
        $num = ($num - $mod) / 36;
        $code = $sourceString[$mod].$code;
    }
    return $code;
}

我们来优化上面的代码:

①由于user_id 的位数不固定,所以生成的邀请码长度会不一致,我们可以在生成的$code 左侧统一补充0;

②sourceString 的顺序我们可以换成一个随机的字符串,这样安全性会更好。

如下:

function getUserInviteCode($userId)
{
    $sourceString = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
    $code = '';
    while ($userId > 0) {
        $mod = $userId % 35;
        $userId = ($userId - $mod) / 35;
        $code = $sourceString[$mod] . $code;
    }
    if (strlen($code) < 8)
        $code = str_pad($code, 8, '0', STR_PAD_LEFT);
    return $code;
}

下面我们再写一个解码函数即可:

function getUserIdByInviteCode($code)
{
    $sourceString = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
    //移除左侧的 0
    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($sourceString, $code[$i]) * pow(35, $i);
    }
    return $num;
}

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: