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时,通常不 ...
随机推荐
- IngressController的session stick问题
周末爬坑,IngressController恢复因为镜像下载和版本问题折腾一下午,晚上终于折腾出个眉目. 首先,在Kubernetes的service中是可以设置Session Affinity的.例 ...
- TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:
1.TCP建立连接,三次握手 建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据. 客户端请求服务端建立连接 第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置 ...
- 深入理解JS函数节流和去抖动
一.什么是节流和去抖? 1.节流 节流就是拧紧水龙头让水少流一点,但是不是不让水流了.想象一下在现实生活中有时候我们需要接一桶水,接水的同时不想一直站在那等着,可能要离开一会去干一点别的事请,让水差不 ...
- 关于Java的File类、字节流和字符流
一.File类: 在Windows下的路径分隔符(\)和在Linux下的路径分隔符(/)是不一样的,当直接使用绝对路径时,跨平台会报No Such file or diretory异常. File中还 ...
- MS SQL 标识列的查询
摘自: http://www.2cto.com/database/201212/175000.html SQL标识列的查询 1.判段一个表是否具有标识列 www.2cto.com 可 ...
- 第八章:SCRT搭建ES搜索引擎步骤
1.打开SecureCRT工具,输入服务器IP.端口号,确认后根据提示输入账号密码. 2.进入后判断服务器是否安装过JDK(1.6.0以上版本), 输入命令:# java –version 3.如 ...
- NDK下vfork+execl启动程序
pid_t _pid = vfork(); if (_pid == 0) {//child process LOGV("[ContextSharing]in child process.&q ...
- ini配置文件的读取
.ini 文件是Initialization File的缩写,即初始化文件.是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的各项图形化管理 ...
- 通过web php 执行shell脚本,获取的结果与直接在命令行下获取的结果不同。
公司项目中的一项小功能,统计设备的连接数.其中用到shell脚本来获取已连接设备的统计.使用命令 /bin/netstat -an| grep ESTABLISHED | awk '{print $4 ...
- Android 解决qq分享后返回程序出现的Bug
问题:当我们使用qq分享时,分享成功后选择留在qq,这个时候按home键,回到手机主界面,在点击回到我的app,这个时候会出现界面显示出来了,但是任何事件都不响应,即按钮没反应. 分析:这个时候回到我 ...