Java生成随机不反复推广码邀请码
欢迎进入我的博客:blog.scarlettbai.com查看很多其它文章
近期接到一个需求。要批量生成推广码,首先我们知道推广码的特效有例如以下两点:
1:不可反复
2:不能够被猜測出
关于这两点,我们的思路大体分为例如以下几类:
1:每次生成一个随机码后查数据库是否有同样的,有则又一次生成(每次都要訪问数据库。导致效率极低,不推荐)
2:根据数据库的主键作为唯一键,进行打乱或插入操作,如主键为8000001,取出后生成3位(据需求增减)随机数或字母。插入主键值中。构成如8000E0V0S1D这样的串,可保证推广码不反复及不可猜測出(这样的方式也须要连接数据库取主键,当然能够一次性预生成所需数目的主键,然后生成相应推广码后更新进数据库,效率会高一些)
3:利用算法来保证值唯一。如UUID等,本篇重点介绍此种方式(不需连接数据库,算法选择合适则效率非常高)
详细实现
上面说了,本文重点讨论利用算法实现不反复性,首先我们会想到最简单的方式:UUID,我们来看下详细效果:
图中能够看出。UUID生成的随机串去掉-后长度为32位,尽管能够保证差点儿绝对不会出现反复情况且支持多线程并发也不会反复。可是长度太长,不太有用。
既然UUID被淘汰了,那么接下来我们来看下我们最常接触的SHA算法:
从图中能够看出,SHA算法生成的串也明显太长,淘汰。
接下来我想到了对称加密算法中的RC4,他能够保证密文长度和原字符串长度一样,关于RC4算法本篇不多描写叙述。大家有兴趣能够上google百度一下,算法网上也有一大堆,大家能够随便下一个就好。此处密文选为自增的数字。秘钥写死,接下来我们看一下效果:
图中能够看出。生成的码不在字母及数字范围内,不可能拿这些码给用户作为推广码,那么最简单的一个方式是,将这个码转换为16进制,效果例如以下:
大家能够看到,此时密文都成了我们所熟知的字母和数字,可是长度变为了原字符长度的2倍,只是依然算能够接受,可是看加密后的密文全都是连续性的,不满足推广码第二点的可猜測,并且因为私钥全都一样easy被破解,此处我们不需求解密。所以能够直接把私钥换成UUID,来看下效果:
能够看到。此处生成的密文不再能够猜測出,满足了我们的需求。那么对于是否会反复。我们再来做个測试。此处选用的需加密字符串长度为7位:
从图中能够看出,字符串长度为7位时,生成了九百多万个密文。都没有反复的,基本能够满足绝大部分情况,很多其它的我也没有进行測试。大家有兴趣能够測试下生成多少位时会出现反复。此种做法的优点是。原字符串长度越长。生成的不会反复的密文量级则会更大,大家能够按需调节。
只是这样的方式的唯一不足在于。生成的密文长度是偶数的,假设大家须要确定的奇数长度密文,能够把RC4加密结果用别的方式转换为我们经常使用的字母和数字,楼主本处是没有特殊需求。所以直接採用了转换16进制这样的快捷偷懒的方式。
欢迎关注个人微信公众号:读书健身编程
Java生成随机不反复推广码邀请码的更多相关文章
- Python 练习册--生成唯一激活码(邀请码)
题目是这样子的: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 分析 其实要生成 ...
- java生成随机序列号
1.java生成随机序列号 String deleteUuid = UUID.randomUUID().toString(); 引用Jar包 //java-uuid-generator-3.1.3.j ...
- java 生成随机校验码
1 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffe ...
- java生成随机字符串
学习java comparable特性时候,定义如下Student类,需要需要随机添加学生姓名以及学号和成绩,这是java如何随机生成名字,根据我的查询,我找到目前java库支持两种方法. 1. or ...
- Java生成随机验证码
package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- java生成随机汉字
方法一: public static char getRandomChar() { return (char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0 ...
- 如何用java生成随机验证码
1.VerifyCode 类: 1 package com.HRuinger.enity; ImageIO.write(image, " ...
- springboot搭建项目,实现Java生成随机图片验证码。
这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...
- 使用Java生成word文档(附源码)
当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...
随机推荐
- 高级进阶DB2(第2版)
<高级进阶DB2(第2版)> 基本信息 作者: 牛新庄 出版社:清华大学出版社 ISBN:9787302323839 上架时间:2013-7-3 出版日期:2013 年7月 开本:16开 ...
- jdo pom
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- iOS:分段控件UISegmentedControl的详细使用
分段控件:UISegmentedControl 功能:分段的控制.页面的切换等. 介绍:当用户输入不仅仅是布尔值时,可使用分段控件(UISegmentedControl).分段控件提供一栏按钮 ...
- 【转载】【Todo】电商架构相关技术分析
看了一篇文章: http://kb.cnblogs.com/page/193670/ 淘宝应对"双11"的技术架构分析 没怎么看懂,有时间再看.
- Linux下解压tar.xz文件
xz -d glib-2.14.tar.xz tar -xvf glib-2.14.tar 前面一个是将xz文件解压成tar文件,后面一个是将tar文件解压. xz使用格式:压缩: xz -z fil ...
- 【Spark】RDD操作具体解释2——值型Transformation算子
处理数据类型为Value型的Transformation算子能够依据RDD变换算子的输入分区与输出分区关系分为下面几种类型: 1)输入分区与输出分区一对一型 2)输入分区与输出分区多对一型 3)输入分 ...
- Win7如何关闭操作中心的图标
运行gpedit.msc,打开组策略编辑器 双击"删除操作中心图标",将其启用即可(重启可见)
- C# Meta Programming - Let Your Code Generate Code - Introduction of The Text Template Transformation Toolkit(T4)
<#@ template language="C#" #> <#@ output extension=".cs" #> <#@ a ...
- [android ndk] -android studio中编译生成so文件
1.android.useDeprecatedNdk=true Error:Execution failed for task ':app:compileDebugNdk'.> Error: N ...
- Android源代码装饰模式---ContextWrapper
假设说Android源代码中哪个地方装饰模式应用的最明显的话,那肯定是非ContextWrapper莫属了,ContextWrapper是一个透明的经典的装饰模式.本文将通过装饰器模式分析Contex ...