根据用户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;
}
时间: 2024-10-19 13:40:10

根据用户id生成一个唯一邀请码的相关文章

今天网站后台登录页面需要生成一个二维码,然后在手机app上扫描这个二维码,实现网站登录的效果及其解决方案如下

要实现二维码登录,需要解决2个技术,1.需要js websocket 与后台php实现长连接技术 2.实现二维码生成技术 要实现这个功能第二个算是比较简单,只需要下载一个php的二维码生成器即可,但要实现长连接技术,经过多方查资料,有2中方式 1种是nodejs来实现后台服务,另外一种是 利用php的一个扩展 swool来实现后台服务,本例采用的是后者swool, 第一步,在打开登录页面的时候,利用php生成一个唯一 sign,用js的websocket技术连接上后台服务,并且把sign发送给后

公司开发的APP,如何生成一个二维码,供客户下载使用

1.其实和简单,因为一般的用户使用扫一扫,大多数都是用微信自带的扫一扫工具 而,微信打开的二维码页面,会自动屏蔽apk文件,所以显然把apk的url生成一个二维码,让用户扫一扫就能直接下载,这样是行不通的. 2.正确的做法应该是这样的, (1).先做一个下载页面,放在你的服务器上,IOS和android链接都放上去,显得比较专业,如果ios没有做好,就不要放 如下所示: 2.把下载页面的url地址,通过“草料二维码”生成一个二维码 3.如果是在微信扫一扫打开的,当用户点击"Android下载&q

使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能

1.需求 将下边的功能实现Dao: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户信息 2. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类 3.User.xml映射文件的内容为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "h

大发快 三官方唯一邀请码66665650

[叶晟威导师:45363642][邀请码66665650][网纸1hx点app]平常心并不是天生的,而是逐渐练就的,是在生活中,在工作中,在与人打交道的过程中,不断练就出来的,是在自我成长中,慢慢体验出来的,也是透过领悟一点一滴积存的.练就平常心,有时甚至要经过摔打.磨练,从痛苦中去寻找,在失败中去体会.认识自我,了解自我,这是练就平常心的起点.人只有不断地调整自我,使自我意识到达某种境地,才能时常保持一颗平常心.人生起伏不定,路要怎么走,自己决定,走自己的路,让别人去说吧 原文地址:https

使用PHP内置函数 uniqid 和Md5可以生成一个唯一的ID

在高并发中 用Uniqid+MD5基本上没有重复的id <?php $units = array(); for($i=0;$i<1000000;$i++){ $units[]=md5(uniqid(md5(microtime(true)),true)); } $values  = array_count_values($units); $duplicates = []; foreach($values as $k=>$v){ if($v>1){ $duplicates[$k]=$v

小程序-将页面生成一个小程序码分享出去

这个需求我遇到过2次.一次是在识别二维码后跳转到其它页面,另一次是识别二维码后进入到生成小程序码的当前页面. 我有一个梦想,就是成为一名黑客!!!!!! 小程序中js wx.request({        url: '',        method: 'POST',        data: {        ModuleName: "",    //空间名 接口文档里每个接口会有标明 必填        MethodName: "GetQrCode",   

Python qrcode 生成一个二维码

借助第三方库qrcode实现. 二维码图片生成借助pillow qrcode的安装 在命令行中输入 pip install qrcode[pil]   用法: 1.在命令行中输入 qr "Some text" > test.png 2.在python中输入 import qrcode img = qrcode.make('Some data here') 高级用法: 使用QRCode类 import qrcode qr = qrcode.QRCode( version=1, er

sql生成一个唯一标示

IDNEWID() 插入一条: insert into W_1(id,account,password,uname,telnumber,imei) values(NEWID(),'xiaohong','123456','小红','123456789','123654789')--------------------- 作者:qq_34702058 来源:CSDN 原文:https://blog.csdn.net/qq_34702058/article/details/78983328 版权声明:

火山极速版邀请码是多少?实现思路是什么?

在程序开发中,经常会遇到生成火山极速版邀请码(207435861)的需求,最近在火山极速版的过程中,也遇到了邀请码(247755861)生成的问题,Google了一把,没有发现好的生成方案,没办法,只能自己造轮子了,在这里把实现方案记录下来,方便大家,当然如果你有更好的实现方案也可以告诉我. 实现了通过用户id直接生成9位不重复字符邀请码(207435861),通过邀请码直接计算用户id需求如下: 邀请码由9位不重复数字字母组成用户id和邀请码可以相互转化实现思路大概是//验证码字符列表priv