为了账号安全,请及时绑定邮箱和手机立即绑定

邀请码[php自我思路]

标签:
PHP

思路


  • 邀请码映射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;
    }

}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消