mysql 生成邀请码_如何实现用户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;
}
相关推荐:
mysql 生成邀请码_如何实现用户id生成一个唯一邀请码相关推荐
- java生成一条唯一的邀请码_如何实现用户id生成一个唯一邀请码
根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...
- java生成一条唯一的邀请码_根据用户id生成一个唯一邀请码
需求描述:根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'. 这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到 ...
- 用户ID生成唯一邀请码的几种方法
文章目录 1.需求描述 2.需求分析 3.字符集 4.方法一:随机数+唯一性判断(不可逆) 5.方法二:Hash+唯一性判断(不可逆) 6.方法三:进制法(可逆) 7.方法四:进制法+扩散.混淆(可逆 ...
- 如何实现用户id生成一个唯一邀请码
一个10进制的数字短还是一个16进制的数字短? 肯定是16进制相对短一些,所以我们可以直接把用户id转成10+26=36进制的不就可以了吗?具体代码如下: function createCode($u ...
- php用户注册自动生成邀请码,PHP如何实现根据用户id生成一个唯一邀请码
根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...
- 基于用户id的最优邀请码生成方案
在程序开发中,经常会遇到生成邀请码的需求,最近在开发海盗鼠的过程中,也遇到了邀请码生成的问题,Google了一把,没有发现好的生成方案,没办法,只能自己造轮子了,在这里把实现方案记录下来,方便大家,当 ...
- 通过用户id生成邀请码
已知一个用户的ID(ID是长整形)根据用户ID给用户生成一个唯一的邀请码(邀请码范围([a-z0-9])?代码实现! 字符a-z0-9刚好是36个.是否可以考虑直接将用户ID转换成一个36进制的数呢? ...
- java 生成不重复的序列号_根据自增ID生成不重复序列号
实现根据long类型的用户ID生成6位随机邀请码,并且根据邀请码能算出用户ID.代码如下: /// /// 不重复随机字符串类 /// public class SerialNumberHelper ...
- linux uid 不同用户,Linux系统中每个用户都有一个唯一的UID,超级用户的UID是 。
Linux系统中每个用户都有一个唯一的UID,超级用户的UID是 . 0.5用分数表示是______,约成最简分数是______.线偏振光在n1和n2介质的界面上发生全反射,线偏振光电矢量的振动方向与 ...
最新文章
- 倒计时 3 天!「2019 嵌入式智能国际大会」全日程大公开!
- python详细安装教程linux-Python 环境安装步骤
- 蓝桥备赛第一周2021.1.11 递归 枚举 位运算
- HDU1016(DFS)
- 操作excel的一些方法
- OpenCV函数cvFindContours
- mysql 5.6 dmr_CentOS下mysql5.6升级5.7指南
- LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树
- 张量网络机器学习:最近的进展和前沿,109页ppt
- python处理mat数据和处理png的区别_Python---利用scipy.misc等库对jpg以及png等图像数据预处理(用于深度学习喂数据)...
- 图片上传的ajax代码,一个伪ajax图片上传代码的例子
- php6 配置,thinkphp6下载安装与配置图文详细讲解教程(composer下载安装)
- java常用的date类
- 【优化算法】亨利气体溶解度优化算法(HGSO)【含Matlab源码 127期】
- RS485收发的3种典型电路-重点-自动收发电路
- 区块链是什么通俗解释_区块链是什么?1个例子通俗解释,小白秒懂!
- histogram函数 python_Python numpy.histogram函数方法的使用
- android transact,Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败分析...
- 运筹说 第42期 | 算法介绍之运输问题
- 小鸡手柄和劲玩X3蓝牙手柄对比
热门文章
- 时空猎人精灵芯片攻略详解
- 就业协议和劳动合同是一回事吗?
- 商城系统运营模式有哪些?有什么优缺点?
- java.lang.inc,Java 字符串的拼接详解
- python判断语句中while not XXX或者 if not 的含义和用法
- 学院旅行计算机学院,计算机学院学生会 | 关于我们,你所不知道的……
- oracle+xquery函数,oracle_xquery介绍.doc
- creator 跳跃弧线_(转)CocosCreator零基础制作游戏《极限跳跃》七、制作游戏结束场景并实现场景切换...
- 跑跑卡丁车连接不上服务器无响应,跑跑卡丁车无法连接服务器怎么办?
- 骗子收录查询系统源码 附教程