欢迎进入我的博客: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. 【转】Points To Line

    原文地址 Python+Arcpy操作Points(.shp)转换至Polyline(.shp),仔细研读Points To Line (Data Management)说明,参数说明如下: Inpu ...

  2. appium+python自动化50-生成定位对象模板templet(jinja2)

    前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以 ...

  3. vc2005(visual studio)使用习惯记录

    来源:http://blog.csdn.net/zdl1016/article/details/6184549 前言:sourceinsight不支持显示utf-8的文件, 实在是一大遗憾!vim现在 ...

  4. [Java]在窗口界面上画出硬盘中图片文件

    利用类javax.swing.JPanel来在窗口界面上画图.图片文件通过javax.imageio.ImageIO类来获取. import java.awt.Graphics; import jav ...

  5. 机器学习-Confusion Matrix混淆矩阵、ROC、AUC

    本文整理了关于机器学习分类问题的评价指标——Confusion Matrix.ROC.AUC的概念以及理解. 混淆矩阵 在机器学习领域中,混淆矩阵(confusion matrix)是一种评价分类模型 ...

  6. 什么是JSONP?

    一.先说说JSONP是怎么产生的: 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助 ...

  7. Java实现文件MD5加密

    代码实现: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.s ...

  8. 第九章:Elasticsearch集群优化及相关节点配置说明

    Linux系统调优: Linux调整打开文件数(重新启动生效) 在/etc/security/limits.conf在文件中增加: * soft nofile 8192 * hard nofile 2 ...

  9. 003java面试笔记——【java基础篇】从团八百失败面试总结的java面试题(未完待续)

    8.java 线程     1)线程概念,线程与进程      线程:线程是“进程”中某个单一顺序的控制流.也被称为轻量进程.线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程.线 ...

  10. threadlocal 变量 跟synchronized 关键字的关系

    为什么叫threadloca变量呢,经过大量的查资料发现threadlocal并不是之前理解的控制线程用的东西,它其实也属于一类变量,只不过是线程的局部变量,它的作用就是实现线程间对该变量的唯一线程调 ...