根据用户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;

}

相关推荐:

mysql 生成邀请码_如何实现用户id生成一个唯一邀请码相关推荐

  1. java生成一条唯一的邀请码_如何实现用户id生成一个唯一邀请码

    根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...

  2. java生成一条唯一的邀请码_根据用户id生成一个唯一邀请码

    需求描述:根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'. 这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到 ...

  3. 用户ID生成唯一邀请码的几种方法

    文章目录 1.需求描述 2.需求分析 3.字符集 4.方法一:随机数+唯一性判断(不可逆) 5.方法二:Hash+唯一性判断(不可逆) 6.方法三:进制法(可逆) 7.方法四:进制法+扩散.混淆(可逆 ...

  4. 如何实现用户id生成一个唯一邀请码

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

  5. php用户注册自动生成邀请码,PHP如何实现根据用户id生成一个唯一邀请码

    根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...

  6. 基于用户id的最优邀请码生成方案

    在程序开发中,经常会遇到生成邀请码的需求,最近在开发海盗鼠的过程中,也遇到了邀请码生成的问题,Google了一把,没有发现好的生成方案,没办法,只能自己造轮子了,在这里把实现方案记录下来,方便大家,当 ...

  7. 通过用户id生成邀请码

    已知一个用户的ID(ID是长整形)根据用户ID给用户生成一个唯一的邀请码(邀请码范围([a-z0-9])?代码实现! 字符a-z0-9刚好是36个.是否可以考虑直接将用户ID转换成一个36进制的数呢? ...

  8. java 生成不重复的序列号_根据自增ID生成不重复序列号

    实现根据long类型的用户ID生成6位随机邀请码,并且根据邀请码能算出用户ID.代码如下: /// /// 不重复随机字符串类 /// public class SerialNumberHelper ...

  9. linux uid 不同用户,Linux系统中每个用户都有一个唯一的UID,超级用户的UID是 。

    Linux系统中每个用户都有一个唯一的UID,超级用户的UID是 . 0.5用分数表示是______,约成最简分数是______.线偏振光在n1和n2介质的界面上发生全反射,线偏振光电矢量的振动方向与 ...

最新文章

  1. 倒计时 3 天!「2019 嵌入式智能国际大会」全日程大公开!
  2. python详细安装教程linux-Python 环境安装步骤
  3. 蓝桥备赛第一周2021.1.11 递归 枚举 位运算
  4. HDU1016(DFS)
  5. 操作excel的一些方法
  6. OpenCV函数cvFindContours
  7. mysql 5.6 dmr_CentOS下mysql5.6升级5.7指南
  8. LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树
  9. 张量网络机器学习:最近的进展和前沿,109页ppt
  10. python处理mat数据和处理png的区别_Python---利用scipy.misc等库对jpg以及png等图像数据预处理(用于深度学习喂数据)...
  11. 图片上传的ajax代码,一个伪ajax图片上传代码的例子
  12. php6 配置,thinkphp6下载安装与配置图文详细讲解教程(composer下载安装)
  13. java常用的date类
  14. 【优化算法】亨利气体溶解度优化算法(HGSO)【含Matlab源码 127期】
  15. RS485收发的3种典型电路-重点-自动收发电路
  16. 区块链是什么通俗解释_区块链是什么?1个例子通俗解释,小白秒懂!
  17. histogram函数 python_Python numpy.histogram函数方法的使用
  18. android transact,Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败分析...
  19. 运筹说 第42期 | 算法介绍之运输问题
  20. 小鸡手柄和劲玩X3蓝牙手柄对比

热门文章

  1. 时空猎人精灵芯片攻略详解
  2. 就业协议和劳动合同是一回事吗?
  3. 商城系统运营模式有哪些?有什么优缺点?
  4. java.lang.inc,Java 字符串的拼接详解
  5. python判断语句中while not XXX或者 if not 的含义和用法
  6. 学院旅行计算机学院,计算机学院学生会 | 关于我们,你所不知道的……
  7. oracle+xquery函数,oracle_xquery介绍.doc
  8. creator 跳跃弧线_(转)CocosCreator零基础制作游戏《极限跳跃》七、制作游戏结束场景并实现场景切换...
  9. 跑跑卡丁车连接不上服务器无响应,跑跑卡丁车无法连接服务器怎么办?
  10. 骗子收录查询系统源码 附教程