欢迎进入我的博客: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. nio selector

    为什么使用Selector? 仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道.事实上,可以只用一个线程处理所有的通道.对于操作系统来说,线程之间上下文切换的开销很大,而且每 ...

  2. opencv Mat 像素操作

    1 cv::Mat cv::Mat是一个n维矩阵类,声明在<opencv2/core/core.hpp>中.   class CV_EXPORTS Mat { public: //a lo ...

  3. ES6 import 引用文件夹/目录及其处理过程

    1.现象 看redux的时候发现官网的教程里直接import了一个文件夹,我再三确定没有看错, 是一个 文件夹 (Directory), 它直接 import了一个目录!这个 文件夹/目录 底下还有一 ...

  4. ubuntu下cmake自动化编译的一个例子

    一个CMakeLists.txt的例子参考:https://www.hahack.com/codes/cmake/https://blog.csdn.net/afei__/article/detail ...

  5. WinForm客户端调用 WebService时 如何启用Session

    WinForm客户端调用 WebService时 如何启用Session 摘自: http://www.cnblogs.com/swtseaman/archive/2011/04/18/2020176 ...

  6. C# format 日期 各种 符号 实例分析如何精确C#日期格式到毫秒

    摘 自: http://developer.51cto.com/art/200908/141145.htm 实例分析如何精确C#日期格式到毫秒 2009-08-03 10:48 paulfzm jav ...

  7. app store 注册账号生成证书上传app完整的教程

    app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司ios开发者计划$99/年 企业ios开发者计划$299/年 高校ios开发者计划免费 在这里主要介绍一下公司ios ...

  8. Maven仓库设置代理

    线上服务器是没有外网环境的, 添加代理配置如下: <settings>     ...    <proxies>       <proxy>          &l ...

  9. 【实践】用for-in 循环实现三联联动

    之前用jq 做过一次三联联动以及四联联动 现在为了更好地了解对象用js的原生方式做了一次 *本节要点方法:  obj.selectedIndex  获取下拉列表选中的option 的索引  obj.o ...

  10. android开发笔记之Volley (1)

    1. volley的简介 Volley is an HTTP library that makes networking for Android apps easier and most import ...