唯一邀请码生成策略

需求:按照随机策略生成一个不重复的邀请码(字母+数字),既要不重复又要保证性能。每个用户对应一个邀请码,必须做到唯一性。邀请码的需要手动输入所以长度不能太长,同时不能让用户猜到邀请码的生成逻辑,所以邀请的生成逻辑也必须要随机。

目的 :生成不重复的邀请码

1.如何做到不重复

  • 方案一:

利用生成邀请码时间戳进行生成,并且加上随机数,能保证不同时间生成的邀请码大部分不同(不排序小概率碰撞)。为了减少碰撞率,可以精确到毫秒颗粒度,但同时也增长了邀请码的长度。

弊端:秒/毫秒颗粒度的时间长度(10/13位)+ 随机码(4位)会导致邀请码的长度达到10+位,这对于用户的体验是极其不好的,而且也容易被猜到邀请码的生成逻辑,因此此方案不推荐。

  • 方案二:

1.通过方案一的弊端,我们知道生成一个合格的邀请码我们需要解决的第一个问题就是长度。长度的设置是关乎可生成邀请码的数量的范围,设置太少的话邀请码的范围有限,设置太长的码邀请码对于用户的体验不好。所以考虑这两个情况,我们可以将邀请码的长度定义6位。


2.要解决的第二个问题就是重复的问题。要保证不重复,简单来说最好的方式就是自增,例如1,2,3,....这样子就能保证绝对唯一,可以将用户的自增id作为邀请码的自增值做绑定。这样做的好处就是能够保证不重复,但是很容易被用户猜测到生成逻辑以及一些用户的敏感数据。既然自增能够保证唯一性,那我们不妨换一种思维去思考,可不可以在自增的基础上面将规律给打乱,这样就能保证邀请码唯一且无规律了。


做法:一个自增点会导致数量连续有规律,那么我们可以设置多个池子,每个池子维护一个自增点,随机去一个池子通过自增id生成,就能够做到随机了。因为邀请码的长度有限制,所以我们需要算出来邀请码最大的范围值有多少,然后将最大的范围值分成若干个池子。

6位(数字+字母)长度的邀请码,根据可取字符的数量,我们将邀请码的形式设置为36进制数,这样邀请码的范围值就是为000000~
zzzzzz,也就是等于十进制的2176782335,相当于我们最多能够生成2176782335个邀请码。如果此数量不满足业务上的需求,可以根据业务要求适当增删。我们假设每个池子能够存储邀请码的数量为10000个,则会有217678个池子。我们每个自增点就等于:邀请码 = (池子number * 10000 + 自增点)转成32进制 的字符串。

用个图来表示以上的过程:

要注意红色字体,每个池子有最大自增点限制,为该池子能够存储邀请的最大数量。通过上述过程就能做到生成一个唯一且无明显规律的邀请码。当然要想最大程度无规律的话,可以将前几个池子给剔除掉,这样子就不会出现000001这样子的邀请码


代码实践(PHP版本):主要思路是利用redis集合的特点进行存储自增点以及池子。

<?php
class Code{
protected  Redis $redis;
private $codeIncrementSet = 'code_increment_set';
private $codeAvailableSet = 'code_available_set';
public function __construct(){$this->redis = new Redis();$this->init();
}//初始化
private function init(){if (0 === $this->redis->exists($this->codeIncrementSet)){//添加1-217678序号的池子,并且自增点设置为0$this->redis->zAdd($this->codeIncrementSet,array_fill(1,217678),0);//保存1-217678序号的可用池子$this->redis->sAddArray($this->codeAvailableSet,range(1,217678))}
}
public function getCode(){//随机取一个可用的邀请码池子if (is_null($index = $this->redis->srandmember($codeAvailableSet))){throw new BusinessException('可用邀请码码数为空');}//获取对应需要池子的自增点$increment =  (int)$this->redis->zScore($this->codeIncrementSet,$index)//计算code值$number = (int)index * 10000 + $increment;//维护自增点$this->redis->zIncrBy($this->codeIncrementSet,1,$index);//该池子被用完了if (9999 === $increment){$this->redis->sRem($this->codeAvailableSet,$index);}//返回36进制的邀请码,用0部位return str_pad(base_convert($number, 10, 36), 6, '0', STR_PAD_LEFT);
}
}

PHP 复制 全屏

以上就是整体代码的实现,具体的一些细节可根据业务自定义调整。

2.如何做到高性能

生成用户邀请码是一个频繁的操作,如果每次实时生成的话性能会比较低。可用利用空间换时间的思维。预先生成一批邀请码然后在需要的时候直接拿出来用即可。这种思路在开发中很常见,异步处理,用空间换取时间。通过这种方式就能快速的生成邀请码。


以上就是如何生成唯一无规律邀请码的策略,方法很简单却很有效。将思路输出成文章的形式,能够更好地加深理解,以及能够让更多的人看到,指出其中的不足。

互勉:保持空杯心态,做一个有态度的程序员。

个人原创,转载需取得作者同意。个人博客地址:https://www.goldenleek.top

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64522.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DMES-2023第十三届数字营销与电商峰会大会 火热报名中

2023第十三届数字营销与电商峰会将于7月6-7日在上海召开&#xff01; 本次峰会线上线下同步举行&#xff0c;将通过七大热点主题帮助品牌主突破模式能力&#xff0c;回归初心、精耕细作&#xff0c;实现可持续增长&#xff1b;提升产品能力&#xff0c;实现可持续长期增长&…

2023第十三届中国数字营销与电商创新峰会 嘉宾揭晓

2023第十三届中国数字营销与电商创新峰会将于7月6日-7日在上海召开。 本次峰会将通过七大热点主题帮助品牌主突破模式能力&#xff0c;回归初心、精耕细作&#xff0c;实现可持续增长&#xff1b;提升产品能力&#xff0c;实现可持续长期增长&#xff1b;优化营销能力&#xf…

MIMIC-IT:280万条多模态指令-响应对,八种语言通用,首个涵盖视频内容的指令数据集...

本文来源 机器之心 编辑&#xff1a;蛋酱 在包含 280 万条多模态上下文指令 - 相应对的数据集上训练之后&#xff0c;Otter 展现出了优秀的问答能力&#xff0c;并在 ChatGPT 及人类的两项评估中获得了很高的评价。 近段时间来&#xff0c;AI 对话助手在语言任务上取得了不小…

MIMIC-IT

在包含 280 万条多模态上下文指令 - 相应对的数据集上训练之后&#xff0c;Otter 展现出了优秀的问答能力&#xff0c;并在 ChatGPT 及人类的两项评估中获得了很高的评价。 近段时间来&#xff0c;AI 对话助手在语言任务上取得了不小的进展。这种显著的进步不只是基于 LLM 强大…

【Mac】Mac安装telnet

1.美图 2. 安装 Homebrew 安装 Homebrew 3.安装 (base) lcc@lcc github$ brew install telnet Updating Homebrew... ==> Downloading https://homebrew.bintray.com/bottles/telnet-60.mojave.bottle.tar.gz #########################################################…

mac新版本安装telnet

升级之后突然发现telnet不能用了&#xff0c;执行如下操作即可&#xff1a; telnet安装 安装 homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 这一步&#xff0c;输入密码之后一直回车就可以了。…

苹果电脑安装wintogo不能启动,不妨试试这个软件

2018年&#xff0c;我的联想笔记本电脑太老了&#xff1b;分辨率明显不够&#xff0c;看起也不是很舒服&#xff0c;于是考虑买电脑&#xff1b;起初选择是想买macbook&#xff0c;看了很久要配置高只能买macbookpro&#xff0c;mbp价格要1.8万&#xff1b;准备买的时候还是心痛…

Mac OS 安装telnet命令

telnet安装 安装 homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"下载时的效果&#xff1a; 查看homebrew 是否安装成功 brew help 使用 homebrew 安装telnet brew install telnet 查看telnet是否安装成功 teln…

Mac上的seata安装

太难了太难了 满百度找不到Mac端的seata安装的教程 github上下载seata&#xff0c;或者下面的wp链接 因为我使用的版本是0.9&#xff0c;目前我这里只有0.9的版本 用网盘的形式分享&#xff0c;需要的话直接下就行了 别的版一搜就有了 链接: https://pan.baidu.com/s/1fkRWn1E…

WTG:给苹果电脑安装Windows

通过WTG把Windows安装到U盘、移动硬盘上&#xff0c;这样苹果电脑&#xff08;MacBook&#xff09;就无需把Windows安装到苹果电脑本地硬盘&#xff0c;占用苹果电脑磁盘空间了&#xff1b;不仅方便携带而且即插即用。 同样也支持Windows设备&#xff0c;只需要把软件安装到WTG…

【苹果imessage群发苹果推位置推】软件安装在系统中集成 USBMuxd 服务

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

[MAC 苹果电脑] [Linux 系统] ”苹果电脑使用虚拟机安装 Linux Ubuntu系统”教程

一.前述 研究员买了MAC苹果电脑后&#xff0c;大多想到的一件事&#xff1a;能不能再装一个Linux系统。 MAC的强大办公能力 Linux的开源能力 一个优秀的编程环境。 因为苹果电脑并没有为Linux系统配置相应的驱动&#xff0c;所以不能将其作为双系统安装。这里选择 虚拟机 的方…

非苹果机安装 Mac OS X 全教程~~~~转

安装雪豹系统全攻略 转向Intel阵营为在PC安装Mac OS提供可能 泡泡网主板频道5月13日 从目前桌面级操作系统的格局来看&#xff0c;主要分为Windows、Mac OS以及Linux三大阵营。其中Windows阵营最为强大&#xff0c;占据全球整个桌面级操作系统90%以上的市场份额&#xff0c;苹果…

mac下安装cnpm淘宝镜像

在mac安装cnpm时&#xff0c;输入npm install -g cnpm -registryhttps://registry.npm.taobao.org 报错&#xff1a; npm ERR! code EACCES npm ERR! syscall mkdir npm ERR! path /usr/local/lib/node_modules/cnpm npm ERR! errno -13 npm ERR! Error: EACCES: permission de…

埃隆·马斯克:Facebook Sucks

西雅图IT圈&#xff1a;seattleit 【今日作者】宇直 宇宙第一直男 " 特斯拉CEO埃隆马斯克(Elon Musk)不喜欢脸书&#xff0c;这不是秘密。 今年2月&#xff0c;马斯克公开鼓动脸书用户注销账户&#xff0c;旗下特斯拉和SpaceX均没有注册脸书账户。上周&#xff0c;马斯克又…

89元之小度音箱测评

作为AI行业的渣渣&#xff0c;出于对技术的热爱&#xff0c;抢了几次&#xff0c;终于抢到了89元的小度音箱&#xff0c;说到抢&#xff0c;期间还有几多曲折&#xff0c;这里不细细展开了&#xff08;之前看到过科大的阿尔法蛋&#xff0c;感觉贵&#xff0c;没出手&#xff0…

蓝色音箱改装电源_神改装:用小度音箱改装DIY音频AUX口,结局是大跌眼镜

唠唠叨叨的序言 ——“生命在于折腾” 小树是一名喜欢拆拆卸卸的小伙伴&#xff0c;手里的电子产品恨不得都拆一遍&#xff0c;看看都有啥捣鼓的&#xff0c;从小小的青铜也慢慢升级了起来&#xff0c;每一次“瞎折腾”的背后&#xff0c;都希望能得到各位看官们的认可&#xf…

同网络的计算机能共享音箱吗,2019年PC“老爷机”局域网内DLNA共享音乐到小度智能音箱全记录...

2019年PC“老爷机”局域网内DLNA共享音乐到小度智能音箱全记录 2019-10-07 11:34:17 18点赞 72收藏 7评论 创作立场声明:非IT领域从业人员,不足之处多探讨交流指正 导论 土豪朋友们就不用看了,这次总结了下就是闲着没事瞎折腾,再总结发现本质就是把笔记本改造为局域网内多媒…

用Linux开发板制作智能音箱,【工程师实战】只要几步,普通音箱秒变小度智能音箱...

原标题:【工程师实战】只要几步,普通音箱秒变小度智能音箱 电子大改造来了,这次把家里的闲置音箱改造下,来个智能语音识别 这是普通的小音箱 我们需要在树莓派3B上搭载DuerOS的人工智能操作系统-度秘,电子音箱为语音输出,再通过语音阵列板作为中间的语音拾取和转换,联网…

智能红外遥控器(六):小度音箱控制格力空调

本例程的原理是百度音箱和开发板都连接WIFI&#xff0c;百度音箱通过Blinker 服务器来控制开发板&#xff0c;开发板通过红外控制格力空调&#xff0c;红外控制同第5章使用的也是IRremoteESP8266库。 在Blinker APP上添加WIFI设备 进入Blinker app&#xff0c;点击右上角“”号…