Java生成随机不重复推广码邀请码
2017-09-21 10:00
232 查看
非常感谢
http://blog.csdn.net/silk_bar/article/details/51040194
最近接到一个需求,要批量生成推广码,首先我们知道推广码的特效有如下两点:
1:不可重复
2:不可以被推测出
关于这两点,我们的思路大体分为如下几类:
1:每次生成一个随机码后查数据库是否有相同的,有则重新生成(每次都要访问数据库,导致效率极低,不推荐)
2:依据数据库的主键作为唯一键,进行打乱或插入操作,如主键为8000001,取出后生成3位(据需求增减)随机数或字母,插入主键值中,构成如8000E0V0S1D这种串,可保证推广码不重复及不可推测出(这种方式也需要连接数据库取主键,当然可以一次性预生成所需数目的主键,然后生成对应推广码后更新进数据库,效率会高一些)
3:利用算法来保证值唯一,如UUID等,本篇重点介绍此种方式(不需连接数据库,算法选择合适则效率很高)
具体实现
上面说了,本文重点讨论利用算法实现不重复性,首先我们会想到最简单的方式:UUID,我们来看下具体效果:
![](https://img-blog.csdn.net/20160401235614239)
图中可以看出,UUID生成的随机串去掉-后长度为32位,虽然可以保证几乎绝对不会出现重复情况且支持多线程并发也不会重复,但是长度太长,不太实用。
既然UUID被淘汰了,那么接下来我们来看下我们最常接触的SHA算法:
![](https://img-blog.csdn.net/20160401235644739)
从图中可以看出,SHA算法生成的串也明显太长,淘汰。
接下来我想到了对称加密算法中的RC4,他可以保证密文长度和原字符串长度一样,关于RC4算法本篇不多描述,大家有兴趣可以上google百度一下,算法网上也有一大堆,大家可以随便下一个就好,此处密文选为自增的数字,秘钥写死,接下来我们看一下效果:
![](https://img-blog.csdn.net/20160402000051022)
图中可以看出,生成的码不在字母及数字范围内,不可能拿这些码给用户作为推广码,那么最简单的一个方式是,将这个码转换为16进制,效果如下:
![](https://img-blog.csdn.net/20160402000144381)
大家可以看到,此时密文都成了我们所熟知的字母和数字,但是长度变为了原字符长度的2倍,不过依旧算可以接受,但是看加密后的密文全都是连续性的,不满足推广码第二点的可推测,而且由于私钥全都一样容易被破解,此处我们不需求解密,所以可以直接把私钥换成UUID,来看下效果:
![](https://img-blog.csdn.net/20160401235744239)
可以看到,此处生成的密文不再可以推测出,满足了我们的需求,那么对于是否会重复,我们再来做个测试,此处选用的需加密字符串长度为7位:
![](https://img-blog.csdn.net/20160401235907255)
从图中可以看出,字符串长度为7位时,生成了九百多万个密文,都没有重复的,基本可以满足绝大部分情况,更多的我也没有进行测试,大家有兴趣可以测试下生成多少位时会出现重复。此种做法的好处是,原字符串长度越长,生成的不会重复的密文量级则会更大,大家可以按需调节。
不过这种方式的唯一不足在于,生成的密文长度是偶数的,如果大家需要确定的奇数长度密文,可以把RC4加密结果用别的方式转换为我们常用的字母和数字,楼主本处是没有特殊需求,所以直接采用了转换16进制这种快捷偷懒的方式。
http://blog.csdn.net/silk_bar/article/details/51040194
最近接到一个需求,要批量生成推广码,首先我们知道推广码的特效有如下两点:
1:不可重复
2:不可以被推测出
关于这两点,我们的思路大体分为如下几类:
1:每次生成一个随机码后查数据库是否有相同的,有则重新生成(每次都要访问数据库,导致效率极低,不推荐)
2:依据数据库的主键作为唯一键,进行打乱或插入操作,如主键为8000001,取出后生成3位(据需求增减)随机数或字母,插入主键值中,构成如8000E0V0S1D这种串,可保证推广码不重复及不可推测出(这种方式也需要连接数据库取主键,当然可以一次性预生成所需数目的主键,然后生成对应推广码后更新进数据库,效率会高一些)
3:利用算法来保证值唯一,如UUID等,本篇重点介绍此种方式(不需连接数据库,算法选择合适则效率很高)
具体实现
上面说了,本文重点讨论利用算法实现不重复性,首先我们会想到最简单的方式:UUID,我们来看下具体效果:
图中可以看出,UUID生成的随机串去掉-后长度为32位,虽然可以保证几乎绝对不会出现重复情况且支持多线程并发也不会重复,但是长度太长,不太实用。
既然UUID被淘汰了,那么接下来我们来看下我们最常接触的SHA算法:
从图中可以看出,SHA算法生成的串也明显太长,淘汰。
接下来我想到了对称加密算法中的RC4,他可以保证密文长度和原字符串长度一样,关于RC4算法本篇不多描述,大家有兴趣可以上google百度一下,算法网上也有一大堆,大家可以随便下一个就好,此处密文选为自增的数字,秘钥写死,接下来我们看一下效果:
图中可以看出,生成的码不在字母及数字范围内,不可能拿这些码给用户作为推广码,那么最简单的一个方式是,将这个码转换为16进制,效果如下:
大家可以看到,此时密文都成了我们所熟知的字母和数字,但是长度变为了原字符长度的2倍,不过依旧算可以接受,但是看加密后的密文全都是连续性的,不满足推广码第二点的可推测,而且由于私钥全都一样容易被破解,此处我们不需求解密,所以可以直接把私钥换成UUID,来看下效果:
可以看到,此处生成的密文不再可以推测出,满足了我们的需求,那么对于是否会重复,我们再来做个测试,此处选用的需加密字符串长度为7位:
从图中可以看出,字符串长度为7位时,生成了九百多万个密文,都没有重复的,基本可以满足绝大部分情况,更多的我也没有进行测试,大家有兴趣可以测试下生成多少位时会出现重复。此种做法的好处是,原字符串长度越长,生成的不会重复的密文量级则会更大,大家可以按需调节。
不过这种方式的唯一不足在于,生成的密文长度是偶数的,如果大家需要确定的奇数长度密文,可以把RC4加密结果用别的方式转换为我们常用的字母和数字,楼主本处是没有特殊需求,所以直接采用了转换16进制这种快捷偷懒的方式。
相关文章推荐
- Java生成随机不重复推广码邀请码
- Java生成随机不重复邀请码(数字+字母)
- Java中从[1,36]随机生成7个不重复的数字,放入一个数组中
- java中随机生成随机数及不重复的随机数字
- 中软面试(一):java写一个随机生成四位数的程序 每位数字不重复
- java随机生成6/8/12位数,要求每次产生的随机数与已生成的随机数不重复
- java 随机指定范围内且生成不重复的数
- java随机生成邀请码(数字+字母)
- Java简单易懂的生成不重复随机整数数组的方法
- java中生成不重复随机的数字
- Java编程实现从给定范围内随机N个不重复数生成随机数的方法小结
- 【Java】随机生成不重复的字母数组
- java 一个int数组 长度为100 随机生成100个数 即1-100 将其插入进数组 插入的数字不能重复
- 【Java】Java复习笔记-三大排序算法,堆栈队列,生成无重复的随机数列
- java中生成不重复随机的数字
- java生成随机不重复id
- 生成指定范围内无重复的随机乱序数组(JAVA实现/时间复杂度为O(n))
- Java生成随机不重复的数字
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串