根据用户id生成一个唯一邀请码

本文来源网络版权归原作者所有

需求描述:根据用户id生成与之对应的 唯一邀请码 ,范围为‘0-9A-Z’。

这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。

错误思路

随机生成一个字符串,再将用户id拼接到字符串后面,但是这样id就太明显了,容易暴露,而且如果id很长的话,会导致邀请码很长,不利于用户使用。

所以可以将用户id插入到生成的字符串中,隔一个字符插入一个id的数字,这样id混合在字符串中,不容易暴露,但是长度问题并没有得到优化,于是把隔一个字符插入一个id的数字改为隔一个字符插入两个id的数字。然而长度好像并没有受到太大的影响。

正解

思考:一个10进制的数字短还是一个16进制的数字短?
肯定是16进制相对短一些,所以我们可以直接把用户id转成10+26=36进制的不就可以了吗?具体代码如下:

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

邀请码保证了唯一性,并且长度不会太长,用户id也能够根据邀请码反推出来,但是有一点不好的是,别人也可以根据邀请码去反推出user_id,因此,我们需要做一些优化。

优化

把0剔除,当做补位符号,比如小于四位的邀请码在高位补0,这样36进制就变成了35进制,然后把字符串顺序打乱,这样,在不知道$source_string的情况下,是没办法解出正确的user_id的。

代码如下:

function createCode($user_id) {
    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
    $num = $user_id;
    $code = '';
    while ( $num > 0) {
        $mod = $num % 35;
        $num = ($num - $mod) / 35;
        $code = $source_string[$mod].$code;
    }
    if(empty($code[3]))
        $code = str_pad($code,4,'0',STR_PAD_LEFT);
    return $code;
}

这样,对应user_id的唯一邀请码就生成了,再附一个解码函数:

function decode($code) {
    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
    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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 需求描述:根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’。 这个需求的重点在于加粗的部分,也就是要能...
    xx_路飞阅读 14,812评论 22 105
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 最近优化项目,整理了一下如何分析第三方统计上来的bug; 前提是你知道了bug出现的当前的.dSYM,分渠道匹配....
    向文军阅读 5,211评论 5 12
  • 九月的一个清晨,金色的阳光已遍洒大地,道路旁的两侧草地中,昨晚蜘蛛在蒿草间新结的无数小小蛛网,还兜着一网晨露。 田...
    mitsusie阅读 404评论 0 1