欢迎进入我的博客:blog.scarlettbai.com查看更多文章

最近接到一个需求,要批量生成推广码,首先我们知道推广码的特效有如下两点:

1:不可重复

2:不可以被推测出

关于这两点,我们的思路大体分为如下几类:

1:每次生成一个随机码后查数据库是否有相同的,有则重新生成(每次都要访问数据库,导致效率极低,不推荐)

2:依据数据库的主键作为唯一键,进行打乱或插入操作,如主键为8000001,取出后生成3位(据需求增减)随机数或字母,插入主键值中,构成如8000E0V0S1D这种串,可保证推广码不重复及不可推测出(这种方式也需要连接数据库取主键,当然可以一次性预生成所需数目的主键,然后生成对应推广码后更新进数据库,效率会高一些)

3:利用算法来保证值唯一,如UUID等,本篇重点介绍此种方式(不需连接数据库,算法选择合适则效率很高)

具体实现

上面说了,本文重点讨论利用算法实现不重复性,首先我们会想到最简单的方式:UUID,我们来看下具体效果:

图中可以看出,UUID生成的随机串去掉-后长度为32位,虽然可以保证几乎绝对不会出现重复情况且支持多线程并发也不会重复,但是长度太长,不太实用。

既然UUID被淘汰了,那么接下来我们来看下我们最常接触的SHA算法:

从图中可以看出,SHA算法生成的串也明显太长,淘汰

接下来我想到了对称加密算法中的RC4,他可以保证密文长度和原字符串长度一样,关于RC4算法本篇不多描述,大家有兴趣可以上google百度一下,算法网上也有一大堆,大家可以随便下一个就好,此处密文选为自增的数字,秘钥写死,接下来我们看一下效果:

图中可以看出,生成的码不在字母及数字范围内,不可能拿这些码给用户作为推广码,那么最简单的一个方式是,将这个码转换为16进制,效果如下:

大家可以看到,此时密文都成了我们所熟知的字母和数字,但是长度变为了原字符长度的2倍,不过依旧算可以接受,但是看加密后的密文全都是连续性的,不满足推广码第二点的可推测,而且由于私钥全都一样容易被破解,此处我们不需求解密,所以可以直接把私钥换成UUID,来看下效果:

可以看到,此处生成的密文不再可以推测出,满足了我们的需求,那么对于是否会重复,我们再来做个测试,此处选用的需加密字符串长度为7位

从图中可以看出,字符串长度为7位时,生成了九百多万个密文,都没有重复的,基本可以满足绝大部分情况,更多的我也没有进行测试,大家有兴趣可以测试下生成多少位时会出现重复。此种做法的好处是,原字符串长度越长,生成的不会重复的密文量级则会更大,大家可以按需调节。

不过这种方式的唯一不足在于,生成的密文长度是偶数的,如果大家需要确定的奇数长度密文,可以把RC4加密结果用别的方式转换为我们常用的字母和数字,楼主本处是没有特殊需求,所以直接采用了转换16进制这种快捷偷懒的方式。


欢迎关注个人微信公众号:读书健身编程

Java生成随机不重复推广码邀请码相关推荐

  1. Java生成随机邀请码

    Java生成随机10位不重复邀请码 public static void main(String[] args) {for (int i = 0; i < 10; i++) {System.ou ...

  2. php生成随机唯一推荐码/邀请码/优惠码 固定长度

    认真生活.快乐工作 - 马云 懒惰象生锈一样,比操劳更能消耗身体. ------ 根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推 ...

  3. js生成随机不重复数字的几种方法

    三种方式实现生成随机不重复数字: <!DOCTYPE html> <html> <head><title>生成随机不重复数</title> ...

  4. python输出姓名_Python生成随机不重复姓名昵称

    姓采用百家姓,名字从常用名字高频字选取两个汉字,再和当前时间戳组合,估计应该是不会重复了,代码如下: # -*- coding:utf-8 -*- import random import time ...

  5. Java生成随机数字和字母组合10位数

    /**               * java生成随机数字和字母组合10位数               * @param length[生成随机数的长度]               * @ret ...

  6. Java 生成随机昵称(形容词加名词)

    Java 生成随机昵称 今天写了个使用java生成随机可爱昵称的代码,就是使用形容词拼接名词. package com.haier.util;import java.util.Random;publi ...

  7. java生成随机时间_Java生成某段时间内的随机时间

    上代码: import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { /** * 生成随机时间 ...

  8. java生成随机数组_JAVA生成随机数组10个数字并求和

    JAVA生成随机数组10个数字并求和 本文最终结果大概是这样的',使用java技术随机生成10个数,然后填充一个数组并在消息框中显示数组内容,接着对数组求和输出,将结果显示在消息框中. 设计思路:可以 ...

  9. JAVA 生成数据表图标LOGO二维码

    JAVA 生成数据表图标LOGO二维码 private static final int QRCOLOR = 0xFF000000; // 默认是黑色private static final int ...

最新文章

  1. java严格区分大小写吗_Java是否区分大小写?
  2. OpenCV3图像处理——霍夫曼变换直线检测
  3. JQuery插件制作具有动态效果的网页
  4. kubernetes mysql ip_弄明白kubernetes中的“三种IP”
  5. 事务未提交 别人能读取到吗_Mysql 事务-面试笔记
  6. Mongodb千万级数据在python下的综合压力测试及应用探讨
  7. 【渝粤题库】国家开放大学2021春1354高级英语阅读(2)题目
  8. 剑灵傲雪区最新服务器,12.8日势力优化具体内容 各大区服务器互通情况
  9. oracle默认导出路径linux,传统路径导出 VS 直接路径导出(oracle exp direct=y)
  10. 跑道防侵入,华为云ModelArts平台助力航空器识别AI模型开发
  11. java报错空指针异常_分析使用Spring Boot进行单元测试时,报出空指针异常
  12. 2.5 指数加权平均的偏差修正
  13. 使用WebBrowser自动登录阿里妈妈网站
  14. SCVMM 2012 R2---安装前的准备工作
  15. 利用pygments实现django模板内的语法高亮
  16. Maven基础篇之Maven实战入门-最新IDEA版maven
  17. 毕业季海报设计素材图片大全,送给毕业生们最好的毕业季祝福语文案
  18. 希望自己活成什么样的人
  19. 我的爬虫入门书 —— 《Python3网络爬虫开发实战(第二版)》
  20. 2018年10月7日虚拟机出现无法连接MKS错误提示和docx, rtf类型文件简介

热门文章

  1. 期货开户的条件和流程
  2. 如何获得Oracle分区索引类型
  3. 硒鼓带不带芯片区别_硒鼓带芯片和不带芯片有什么区别
  4. nginx 负载均衡502问题
  5. Python 实现英文新闻摘要自动提取 (2)
  6. div html隐藏边框,div 边框原来有这么多种设置方法
  7. python获取币安k线数据_如何利用Python 爬取币乎的数据
  8. L289N驱动小车方向
  9. java Compiler API (java编译api)
  10. 如何利用企业微信促成交易?