前言

之前收到一个需求,甲方说,他们想给用户生成一个唯一的邀请码,然后用户量在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版本)相关推荐

  1. 趣谈唯一邀请码生成方法

    趣谈唯一邀请码生成方法 前段时间项目上需要生成唯一邀请码!嘿嘿,多简单的一件事,心里就已默默将代码写了一遍.但小小的邀请码生成却也小有乾坤,这就是后话了. 一.最简单的实现 很多人 肯定都和我一开始一 ...

  2. java唯一码_唯一邀请码生成(Java版本)

    前言 之前收到一个需求,甲方说,他们想给用户生成一个唯一的邀请码,然后用户量在xxx之类的,例如我这里就随便说个5kw个吧.这个嘛,听起来都觉得挺简单的,毕竟每个用户基本上都有自己的唯一用户id,用那 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 聚焦WCF行为的扩展
  2. CEDD(Color and Edge Directivity Descriptor)学习篇
  3. 二等水准测量记录数据_公路水准测量培训道路放样测量学习
  4. k8s灰度更新_通过rancher部署k8s过程实战分享
  5. android 打包jar包
  6. mybatis plus当月数据查询_Springboot+mybatis(plus)+druid多数据源
  7. Oracle数据库中的dual表
  8. 【数据结构笔记14】微软面试经典 - 逆转链表问题(Reversing Linked List)
  9. Java I/O系统之OutputStream
  10. c语言调用库函数,C语言库函数调用文件
  11. 好东西都在这里,不点下看看吗(博客目录导航,持续更新中...)
  12. C++读写操作ofstream(数据丢失问题)
  13. 诺基亚java模拟器exe,无需模拟器!骁龙810手机成功运行Win10:可开exe程序
  14. 细谈Type-C、PD原理(二)
  15. 电脑更改开机密码和用户名
  16. HLM(分层线性模型)处理“聚集性”问题!
  17. LuckyFrame使用手册
  18. 实战 | Kaggle竞赛:华盛顿特区首都自行车租赁预测
  19. 解决调试时候出现的“Encountered an improper argument”错误
  20. 如何激发员工内在驱动,制定有挑战的OKR?

热门文章

  1. 开源数据访问组件Smark.Data 1.8
  2. 点击按钮复制文本框中的内容
  3. Android开发之DrawerLayout与NavigationView之间不得不说的基友情
  4. 在CentOS7.6搭建ossec server2.8.3
  5. 手机大PK,终端云服务也将走向“一站式”?
  6. win10 磁盘管理 删除不想要多余分区(恢复分区)
  7. CocosCreator实现将资源文件部署到服务器的艰难摸索
  8. 实验一 网络编程基础环境实验
  9. win32打印机控制,API打印操作
  10. 项目作业丨对话式对战游戏