继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

邀请码[php自我思路]

慕粉2139185169
关注TA
已关注
手记 30
粉丝 27
获赞 128

思路


  • 邀请码映射ID的唯一性
    根据邀请码就可以,解析出用户ID
  • 邀请码的离散性/随机性
    别人很难根据ID猜出邀请码

代码


class InviteCodeService
{
    // HxrhRD
    public static $p_char_lists = [
        ['H', 'h', 'x', 'r', 'R'],
        ['D', 'd', 'Z', 'n', 'N'],
        ['G', 'g', 'X', 'q', 'Q'],
        ['C', 'c', 'o', 'm', 'M'],
        ['W', 'w', 'V', 's', 'S'],
        ['F', 'f', 'y', 'p', 'P'],
        ['A', 'a', 'Y', 'k', 'K'],
        ['E', 'e', 'z', 'u', 'U'],
        ['J', 'j', 'v', 't', 'T'],
        ['B', 'b', 'O', 'l', 'L'],
    ];

    /**
     * 生成邀请码
     * @param $user_id
     * @param int $type 1网红端 2 用户端
     * @return string
     */
    public function generateCode($user_id, $type = 1)
    {
        // 暂定用户量处于千万级
        $code = '';
        $nums = $this->getNumberChars($user_id);
        $char_lists = $type === 1 ? self::$p_char_lists : self::$t_char_lists;
        foreach ($nums as $num) {
            $code .= $char_lists[$num][rand(0, 4)];
        }
        return $code;
    }

    /**
     * 根据邀请码获取id
     * @param $code
     * @param $type 1网红端 2用户端
     * @return int
     */
    public function getUserId($code, $type = 1)
    {
        $id = '';
        $chars = str_split($code);
        $char_lists = $type  === 1 ? self::$p_char_lists : self::$t_char_lists;
        foreach ($chars as $char) {
            foreach ($char_lists as $key => $char_list) {
                if (in_array($char, $char_list)) {
                    $id .= strval($key);
                }
            }
        }

        return intval($id);
    }

    /**
     * 固定6为邀请码
     * 将用户ID 变成6位数字 不足左边补0, 然后变成数字数组
     * @param $num
     * @return array
     */
    protected function getNumberChars($num)
    {
        $nums = str_split($num);
        if ($num < 10) {
            $nums = [0, 0, 0, 0, 0, $num];
        } elseif ($num < 100) {
            $nums = array_merge([0, 0, 0, 0], str_split(strval($num)));
        } elseif ($num < 1000) {
            $nums = array_merge([0, 0, 0], str_split(strval($num)));
        } elseif ($num < 10000) {
            $nums = array_merge([0, 0], str_split(strval($num)));
        } elseif ($num < 100000) {
            $nums = array_merge([0], str_split(strval($num)));
        }
        return $nums;
    }

}
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP