需求:需要一串给各机构独有的优惠码

间接需求:固定长度、不重复、没有规律可循

实现思想如下:

1.首先获取一个UUID

2.去除UUID中的“-”

3.小写转大写

4.获取一个固定长度字符串

5.按照RC4加密算法获取到加密之后的字符串【这里给固定密钥】

6.将加密之后的字符串转化成16进制字符串

7.最后测试,是否会重复

完整代码如下:

【GitHub地址:https://github.com/AngelSXD/myagenorderdiscount

package testExample;

import org.junit.Test;
import java.util.*; public class RC4 { @Test
public void RC4(){
List<String> list = new ArrayList<>();
Set<String> set = new HashSet<>();
System.out.println(System.currentTimeMillis());
for(int i = 0 ; i < 1000000; i++){
String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase().substring(0,16);
String ss = RC42hex02(HloveyRC4(uuid,"angelSXD"));
list.add(ss);
set.add(ss);
} System.out.println("list长度:"+list.size());
System.out.println("set长度:"+set.size());
System.out.println(System.currentTimeMillis()); } public static String RC42hex02(String str){
final String HEX = "0123456789abcdef";
StringBuffer stringBuffer = new StringBuffer();
byte [] bytArr = str.getBytes();
for (byte b : bytArr) {
// 取出这个字节的高4位,然后与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
stringBuffer.append(HEX.charAt((b >> 4) & 0x0f));
// 取出这个字节的低位,与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
stringBuffer.append(HEX.charAt(b & 0x0f));
}
return stringBuffer.toString();
} public static String HloveyRC4(String aInput,String aKey)
{
int[] iS = new int[256];
byte[] iK = new byte[256]; for (int i=0;i<256;i++)
iS[i]=i; int j = 1; for (short i= 0;i<256;i++)
{
iK[i]=(byte)aKey.charAt((i % aKey.length()));
} j=0; for (int i=0;i<255;i++)
{
j=(j+iS[i]+iK[i]) % 256;
int temp = iS[i];
iS[i]=iS[j];
iS[j]=temp;
} int i=0;
j=0;
char[] iInputChar = aInput.toCharArray();
char[] iOutputChar = new char[iInputChar.length];
for(short x = 0;x<iInputChar.length;x++)
{
i = (i+1) % 256;
j = (j+iS[i]) % 256;
int temp = iS[i];
iS[i]=iS[j];
iS[j]=temp;
int t = (iS[i]+(iS[j] % 256)) % 256;
int iY = iS[t];
char iCY = (char)iY;
iOutputChar[x] =(char)( iInputChar[x] ^ iCY) ;
} return new String(iOutputChar); }
}

最后如果愿意,可以自己封装成jar供项目使用,打包给maven使用的引用教程如下:http://www.cnblogs.com/sxdcgaq8080/p/8126770.html

================================================================================================================

【优化版代码地址:https://github.com/AngelSXD/RC4

【java】RC4加密转16进制获取长度为40的不重复优惠码字符串 【未优化版本】的更多相关文章

  1. java byte数组与16进制间的相互转换

      java byte数组与16进制间的相互转换 CreationTime--2018年6月11日15点34分 Author:Marydon 1.准备工作 import java.util.Array ...

  2. Java中char转为16进制

    Java中char转为16进制 char a = '0'; String hexStr = Integer.toHexString(a); System.out.println(hexStr);

  3. Java中byte与16进制字符串的互换原理

    我们都知道Java中的byte是由8个bit组成的,而16进制即16中状态,它是由4个bit来表示的,因为24=16.所以我们可以把一个byte转换成两个用16进制字符,即把高4位和低4位转换成相应的 ...

  4. Java中byte与16进制字符串的互相转换

    * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串. * @param s ...

  5. [转]Java中byte与16进制字符串的互相转换

    Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符, ...

  6. Java对文件的16进制读取和操作

    大家可以参考一下源代码的相关部分注释,然后写出自己的16进制处理程序.有几个重点地方: 16进制字符串->10进制数 int input = Integer.parseInt("Str ...

  7. java字节数组和16进制之间的转换

    /* * To change this template, choose Tools | Templates * and open the template in the editor. */ pac ...

  8. Java 将数字转为16进制,然后转为字符串类型

    public class ArrayTest3 { public static void main(String[] args){ System.out.println(toHex(60)); } / ...

  9. java中byte[] 和16进制字符串互转

    //将byte[]转换为16进制字符串 public static String byte2hex(byte[] b) { StringBuilder hs = new StringBuilder() ...

随机推荐

  1. Linux学习-Boot Loader: Grub2

    boot loader 的两个 stage 在 BIOS 读完信息后,接下来就是会到第一个开机装置 的 MBR 去读取 boot loader 了.这个 boot loader 可以具有选单功能.直接 ...

  2. vss安装注意点

    一:装好IIS 二:win7用管理员权限打开 server configuration 才能打上勾 三:用计算机名,不要用 Ip地址

  3. CDH4 journalnode方式手工安装手册之一

    一.                                环境部署概况   cdh-master 172.168.10.251 cdh-node1 172.168.10.251 cdh-no ...

  4. 由浅入深学习PBR的原理和实现

    目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...

  5. VC6.0与Office2007~2010不兼容问题及解决方法

    一.问题描述 启动打开文件对话框中,在 Visual C++ 使用的键盘快捷键或从文件菜单上将导致以下错误: 在 DEVSHL 中的访问冲突 (0xC0000005).在 0x5003eaed 的 D ...

  6. 21 段实用便捷的 PHP 代码

    PHP 是目前使用最广泛的基于 Web 的编程语言,驱动着数以百万计的网站,其中也包括如 Facebook 等一些大型站点.这里收集了 21 段实用便捷的 PHP 代码摘录,对每种类型的 PHP 开发 ...

  7. [Pandas技巧] 如何把pandas dataframe对象或series对象转换成list

    import pandas as pd >>> df = pd.DataFrame({'a':[1,3,5,7,4,5,6,4,7,8,9], 'b':[3,5,6,2,4,6,7, ...

  8. springboot添加外部jar包及打包

    项目中除了从pom中添加依赖包,还可以添加本地的jar包,怎么做呢? 1.在src下新建目录lib,将jar包添加到lib中 2.在pom文件里添加配置以下属性,就可以使用jar包了 <depe ...

  9. BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法

    注意到$r<k$ 别问我为什么要强调. 考场上前30分水水. 然后写阶乘的时候大力$n\log {n}$预处理 本机跑的挺快的,然后稳稳的T掉了. 然后就是简单的矩阵乘法了. #include ...

  10. [暑假集训--数位dp]LightOj1205 Palindromic Numbers

    A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the sam ...