唯一邀请码生成(Java版本)
前言
之前收到一个需求,甲方说,他们想给用户生成一个唯一的邀请码,然后用户量在xxx之类的,例如我这里就随便说个5kw个吧。这个嘛,听起来都觉得挺简单的,毕竟每个用户基本上都有自己的唯一用户id,用那个来生成就好。
首先,用户体验方面,肯定是大写字母跟数字(如果再体验好一点的,就把数字的 0/1 以及字母O去掉),反正我是偷懒了,用36个字符(A-Z0-9),也就是“Q7VBNYR1HSCUEODIX3K95F48L0P6GAMTWJZ2",至于为啥是乱的,自己去想想吧,反正我是觉得不连贯就好
初阶版本(被喷版,直接用ID来生成)
简单,有用户id嘛,如果用户id是从小的数字开始,那么就直接就除法取整跟取模来做,不够位数就直接补0就好。美滋滋。
private String runMethod1(long id) {String base = "Q7VBNYR1HSCUEODIX3K95F48L0P6GAMTWJZ2";char[] cs = new char[6];for (int i = 0; i < 6; i++) {cs[i] = base.charAt((int) (id % 36));id = id / 36;}return new String(cs);}@Testpublic void method1() {for (int i = 0; i < 10; i++) {System.out.println(String.format("id=%d\t code=%s", i, runMethod1(i)));}}
测试效果:
好了,完成了。不用我多说,肯定很多人第一感觉就是,我想它们再乱点~这个太有规律性了
进阶版本–1(随机字符+db唯一性验证)
看到上面的版本,肯定是不连一个有所追求的程序猿都觉得容忍不了的,毕竟太有规律,一下子就猜到。
好了,没规律是吧,于是就暴力解决
1、随机生成指定长度的字符串(如我这里是6个)
2、用数据库(聪明点的会用redis)来进行唯一性判断
3、步骤2判断成功,就输出,否则就回到步骤1.
嗯,其实这个做法也不错,也没啥大毛病。毕竟我一开始就说这么做的。问题也没啥,一般情况下这个可以满足绝大部分的甲方需求。代码就略了,说得那么清楚,自己写去吧。
进阶版本–2 (继续使用用户id,我真是个机灵鬼)
这个版本,其实就说初阶版本的一个升级。
首先,字符太连贯对吧,解决方法就是我取不同的基础字符串来生成就好啦。于是,我改进成:
邀请码的第一个字符,当做指定基础字符串标记。
邀请码第二到第六 就是简单的一个流水号生成规则。
于是,我就一口气生成了36串无序的字符串
public static void main(String[] args) {String str = "QWERTYUIOPASDFGHJKLZXCVBNM0123456789";for (int i = 0; i < 36; i++) {char[] cs = str.toCharArray();String array = "";int size = 0;while (size < str.length()) {int index = (int) (Math.random() * str.length());if (cs[index] != '-') {array += cs[index];cs[index] = '-';size++;}}System.out.println(array);}}
然后,一个个方到一个list里面。
注意,这里是直接在static中写进去。
private static List<String> baseList;private static final String INDEX = "4NQ5XMV7WRKC0ILEZO2J1PSDH8AU3FBTG6Y9";static {List<String> list = new ArrayList<>();list.add("XLG27OR1QC34FK58JAMPEH9YWU0SZNIDVB6T");list.add("W8DCRPJKYL0FE5QTIVZB6O3X1HUN92SGA47M");list.add("07YHDTEK4NVBQRUZPSGI93C81O2AWJ6FXML5");list.add("QWID3F97N1KY2SZXVUE4LORACB8TJ50G6HMP");list.add("AYZQ8GVJR7PHS501B4CONL26X3WUK9TEFDIM");list.add("SMCIQ4F3RWH56V8NA7TJOB1ZULD29KGY0PEX");list.add("KI835MZWALV7DGP2JO041XHCQYEB9UF6TNRS");list.add("4NQ5XMV7WRKC0ILEZO2J1PSDH8AU3FBTG6Y9");list.add("3VPDTRGM0NUAEH7SW6945OIFC82BYZLXJK1Q");list.add("DEH1MXNC6IULY3K9GPT4WQJVR08B5FSA27OZ");list.add("PZ6WUQDT2MEIHA9Y8RKBL34XGFVSJN7OC150");list.add("7KEDTSVQURXIBJ816Y29LOPCNF0G35WZMAH4");list.add("JHOF7BVZ0ET1DWGX4Q3APCLRMI895K2UY6SN");list.add("80UVJDY3IXA15TP69ZFEHC7QMLGBKSWN2RO4");list.add("4653QA9NLIZCSJKTEPV2DU7BOGXF18MYH0RW");list.add("SOGYRP3TWH8ZJBI6U4KN7X2DFA0QC5VEL1M9");list.add("1S4YA6KNTZIXEC25P03JGOQUMBWRHL987DVF");list.add("NJMXCUTGO7ZL016SWPR8YHEVABKFI423D5Q9");list.add("CT02U35L1RH84FPKMGWJVYNBIZ7DE6SXAOQ9");list.add("2U06HM7TWP1YIBX49SZFEAR8D5QGKO3JVNCL");list.add("ABERN67VO40DFPJYS9H5KW21Z8M3CILGXUTQ");list.add("QP43YJ2ZKA81F7TCSXH6V0BRGEMWLDNO9U5I");list.add("0R7QKXBW3VLPHE48U1Z9DJYNAFTOCIMS56G2");list.add("0C4XVG98NM71HBUDQYZLFRE65SIPKOT23WAJ");list.add("T7YRN3LHWZJGBI4S2FM8UQP0DK69VXCO5EA1");list.add("D2MR7059AGWTSJP8EKUHXLQ6BFZONIVC134Y");list.add("MPB3SQOEU9XLV2R1Y6ZTHGKD8AF50JI4N7CW");list.add("73X4LRF52JC0OETVHMKUNPDI1SQ8BZ6AWY9G");list.add("GF9ASJP2V4HE5LOTY0R1I3C8MUNXW7BKDQ6Z");list.add("J3BLZDY7VGNWSKX0CP4MU18FQ5EHROAI629T");list.add("LTMR0UFP28BJ1OSWXV5G3AN4EKCQYH76IZD9");list.add("MDL7E8TWYS2PI6A3ZXBVJH9OKGQ510RCU4NF");list.add("L2K3WMCBQ6GUDFYZ810XSP4O7RIH59AVNTJE");list.add("DLPBXJ0ROH8AFINQUSME1246VC3T9YZK5G7W");list.add("7CHVSGR1ZEJDMXPF9OY0KT35I6NBLAQ4W28U");list.add("X4V3G9SIET678NUK0FM1BZDYLR2OJC5QWAPH");baseList = Collections.unmodifiableList(list);}public static String genInviteCode(long id) {int key = (int) (id % 36);char[] cs = new char[6];cs[0] = INDEX.charAt(key);String select = baseList.get(key);id=id/36;long code = 1_0000_0000 + id * 13;for (int i = 1; i < 6; i++) {cs[i] = select.charAt((int) (code % 36));code = code / 36;}return new String(cs);}@Testpublic void test() {for (int i = 0; i < 10; i++) {System.out.println(String.format("id=%d\t code=%s", i, genInviteCode(i)));}}
哈哈,这样看起来就美滋滋了,甲方估计就不容易看出来了。这样做就能省了不少访问db/redis的时间,效率也优化了(优化个毛线,一个角色就开始的时候会创建一次邀请码,这个所谓的效率优化都可以无视)
然后,聪明的小伙伴就会发现,这样子弄的话 那么就会每隔36个邀请码,它们的相似度就比较高了。
解决方式有好多,例如你用2个邀请码来做这个标记(我这里是用1位),至于数量够不够,也是你要考虑的一个方向了。
这里仅仅是晚上无聊,想想这个东西有没有别的生成方式才搞出来的。
谢谢支持
唯一邀请码生成(Java版本)相关推荐
- 趣谈唯一邀请码生成方法
趣谈唯一邀请码生成方法 前段时间项目上需要生成唯一邀请码!嘿嘿,多简单的一件事,心里就已默默将代码写了一遍.但小小的邀请码生成却也小有乾坤,这就是后话了. 一.最简单的实现 很多人 肯定都和我一开始一 ...
- java唯一码_唯一邀请码生成(Java版本)
前言 之前收到一个需求,甲方说,他们想给用户生成一个唯一的邀请码,然后用户量在xxx之类的,例如我这里就随便说个5kw个吧.这个嘛,听起来都觉得挺简单的,毕竟每个用户基本上都有自己的唯一用户id,用那 ...
- 用户ID生成唯一邀请码的几种方法
文章目录 1.需求描述 2.需求分析 3.字符集 4.方法一:随机数+唯一性判断(不可逆) 5.方法二:Hash+唯一性判断(不可逆) 6.方法三:进制法(可逆) 7.方法四:进制法+扩散.混淆(可逆 ...
- java生成一条唯一的邀请码_根据用户id生成一个唯一邀请码
需求描述:根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'. 这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到 ...
- java生成一条唯一的邀请码_如何实现用户id生成一个唯一邀请码
根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...
- 如何实现用户id生成一个唯一邀请码
一个10进制的数字短还是一个16进制的数字短? 肯定是16进制相对短一些,所以我们可以直接把用户id转成10+26=36进制的不就可以了吗?具体代码如下: function createCode($u ...
- php用户注册自动生成邀请码,PHP如何实现根据用户id生成一个唯一邀请码
根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...
- mysql 生成邀请码_如何实现用户id生成一个唯一邀请码
根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...
- 基于用户id的最优邀请码生成方案
在程序开发中,经常会遇到生成邀请码的需求,最近在开发海盗鼠的过程中,也遇到了邀请码生成的问题,Google了一把,没有发现好的生成方案,没办法,只能自己造轮子了,在这里把实现方案记录下来,方便大家,当 ...
最新文章
- 聚焦WCF行为的扩展
- CEDD(Color and Edge Directivity Descriptor)学习篇
- 二等水准测量记录数据_公路水准测量培训道路放样测量学习
- k8s灰度更新_通过rancher部署k8s过程实战分享
- android 打包jar包
- mybatis plus当月数据查询_Springboot+mybatis(plus)+druid多数据源
- Oracle数据库中的dual表
- 【数据结构笔记14】微软面试经典 - 逆转链表问题(Reversing Linked List)
- Java I/O系统之OutputStream
- c语言调用库函数,C语言库函数调用文件
- 好东西都在这里,不点下看看吗(博客目录导航,持续更新中...)
- C++读写操作ofstream(数据丢失问题)
- 诺基亚java模拟器exe,无需模拟器!骁龙810手机成功运行Win10:可开exe程序
- 细谈Type-C、PD原理(二)
- 电脑更改开机密码和用户名
- HLM(分层线性模型)处理“聚集性”问题!
- LuckyFrame使用手册
- 实战 | Kaggle竞赛:华盛顿特区首都自行车租赁预测
- 解决调试时候出现的“Encountered an improper argument”错误
- 如何激发员工内在驱动,制定有挑战的OKR?
热门文章
- 开源数据访问组件Smark.Data 1.8
- 点击按钮复制文本框中的内容
- Android开发之DrawerLayout与NavigationView之间不得不说的基友情
- 在CentOS7.6搭建ossec server2.8.3
- 手机大PK,终端云服务也将走向“一站式”?
- win10 磁盘管理 删除不想要多余分区(恢复分区)
- CocosCreator实现将资源文件部署到服务器的艰难摸索
- 实验一 网络编程基础环境实验
- win32打印机控制,API打印操作
- 项目作业丨对话式对战游戏