欢迎进入我的博客: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生成随机不反复推广码邀请码的更多相关文章

  1. Python 练习册--生成唯一激活码(邀请码)

    题目是这样子的: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 分析 其实要生成 ...

  2. java生成随机序列号

    1.java生成随机序列号 String deleteUuid = UUID.randomUUID().toString(); 引用Jar包 //java-uuid-generator-3.1.3.j ...

  3. java 生成随机校验码

    1 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffe ...

  4. java生成随机字符串

    学习java comparable特性时候,定义如下Student类,需要需要随机添加学生姓名以及学号和成绩,这是java如何随机生成名字,根据我的查询,我找到目前java库支持两种方法. 1. or ...

  5. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  6. java生成随机汉字

    方法一: public static char getRandomChar() { return (char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0 ...

  7. 如何用java生成随机验证码

     1.VerifyCode 类:   1 package com.HRuinger.enity;                          ImageIO.write(image, " ...

  8. springboot搭建项目,实现Java生成随机图片验证码。

    这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...

  9. 使用Java生成word文档(附源码)

    当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...

随机推荐

  1. HTTP 错误 404.0 - Not Found 您要找的资源已被删除、已更名或暂时不可用。

    现象:打开一个页面,一直报404异常,但是文件是存在的,打开同一目录下的其它文件都没问题,改文件名也不行,始终找不到原因 解决方案:404异常是一个幌子,实际异常是页面读取了null值,应该报空引用, ...

  2. postgres--流复制

    配置 master 192.168.2.21 5432 slave 192.168.2.22 5432 目录 /var/lib/pgsql/10/data/ 配置主库 配置用户 psql create ...

  3. 【LaTeX】E喵的LaTeX新手入门教程(2)基础排版

    换了块硬盘折腾了好久..联想的驱动真坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇文档框架嗯昨天我们已经编写了一个最基本的文档,其内容是这样的:\documentclass{ar ...

  4. 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。

    客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值.     无论是什么的html控件,只要加上了runat="server" ...

  5. iOS:网页视图控件UIWebView的详解

    网页视图控件:UIWebView 功能:它是继承于UIView的,是一个内置的浏览器控件,以用来浏览从网络下载下来的网页或者本地上加载下来的文档. 枚举: //网页视图导航类型 typedef NS_ ...

  6. scala sbt 添加国内镜像

    FROM: http://www.4wei.cn/archives/1002417 sbt运行时经常需要下载大量的jar包,默认连接到maven官网,速度通常比较慢.在`~/.sbt/`下添加一个`r ...

  7. Mapreduce报错:java.lang.ClassNotFoundException: Class Mapper not found

    mapreduce找不到mapper类 解决方法: 开始自己用的是mapreduce自己打包的一种方法: job.setJarByClass(StandardJob.class); 但这样一直在报错: ...

  8. js怎么获取图片的相对地址

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  9. ElasticSearch位置搜索

    ElasticSearch位置搜索 学习了:https://blog.csdn.net/bingduanlbd/article/details/52253542 学习了:https://blog.cs ...

  10. css学习笔记 --初学 css代码风格、布局误区

    初学css,记录下初学者需要注意的事项. 一.css 代码风格 1.css 命名语义化. 如类名: main   主体   container 内容 footer    站底 right.center ...