需求描述:根据用户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生成一个唯一邀请码,欢迎各位大神一起交流。

java生成一条唯一的邀请码_根据用户id生成一个唯一邀请码相关推荐

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

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

  2. uc浏览器邀请码_阿里云Teambition网盘收到邀请码,上传下载不限速!!!

    微信公众号更新以后,推送不是按照优先来的:你们可以把我的微信公众号点击设置为星标,以便于及时的接收信息. 哈喽!大家好,我是斜杠君,每天早上八点推文(偶然会凌晨),还有关键词是最下面的数字.底部点赞. ...

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

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

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

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

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

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

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

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

  7. php生成游客id_PHP根据用户ID生成唯一的邀请码 | 剑花烟雨江南

    在开发中,我们可能会遇到需要生成用户唯一的邀请码,来做一些邀请活动,接下来,我们思考如何生成唯一的邀请码,且可以根据邀请码获取到用户id. 首先,我们可以考虑使用用户user_id 来生成邀请码,并生 ...

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

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

  9. 知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取.

    知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取. JDGSL4 YPHPV4 CJGYB4 NGXSL4 NNBUJ4 GUEJG4

最新文章

  1. 《F4+2》—团队项目系统设计改进与详细设计
  2. CentOS6.x下配置sendmail发邮件
  3. 排序算法之快速排序(Java)
  4. 初学Golang:Go 的数据类型及常见特性
  5. 异常查错java.net.SocketException: Connection reset
  6. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)
  7. E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/t
  8. C语言程序设计:现代方法阅读笔记
  9. android view 画文字,【Android自定义View】绘图之文字篇(三)
  10. BZOJ 1191 超级英雄 Hero 题解
  11. 计算机毕业设计:基于springboot框架开发的办公自动化OA系统
  12. 5G NR 随机接入 总结
  13. 一个合格的项目经理都需要做哪些事情?
  14. 【android studio】安卓实现mysql数据库登录、注册、重置密码。
  15. stm32 开发软件分享
  16. C语言LCD1602液晶实验报告,LCD1602液晶显示实验报告.doc
  17. TabLayout选中
  18. 3-6CSS揭秘阅读笔记第一章:引言
  19. 什么是元宇宙?宏大的元宇宙中有哪些安全与隐私问题?
  20. 渡月橋 ~君 想ふ~ - 倉木麻衣

热门文章

  1. jsp操作mysql
  2. 微软SerialPort秘籍,SerialPort为什么死锁程序的分析
  3. 合作式智能运输系统 车用通信系统应用层及应用数据交互标准 第二阶段_为什么一定要了解OPC UA TSN——未来的工业通信标准...
  4. Javascript第六章prototype原型向构造器中添加属性,实现构造器共享,节约空间第五课
  5. html自动跳转到锚点,html中的锚点
  6. 果园机器人的写作思路_《果园机器人》三年级教学设计
  7. 语言叮叮消息接口_五分钟学后端技术:如何学习Java工程师必知必会的消息队列...
  8. 2018.7.11 昨天晚上的列表(字典)嵌套题
  9. [USACO08NOV]时间管理Time Management
  10. Hello, world!