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

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

实现思想如下:

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. C++基础——1.变量和基本类型(基于c++11)

    C++11类型 基本类型 字面值常量(literal) 比如:一个形如42的值,即为常量 变量 初始值 初始化不是赋值,初始化是创建变量的时候给一个初始值:而赋值是擦除当前值,用新值代替. 列表初始化 ...

  2. BZOJ 4355: Play with sequence

    调了好久,还是黑盒测试有前途 我以前怕不是学了假的吉利线段树(我第一次知道还要记次小值去更新的........) #include<cstdio> #include<algorith ...

  3. HDU 3435 KM A new Graph Game

    和HDU 3488一样的,只不过要判断一下是否有解. #include <iostream> #include <cstdio> #include <cstring> ...

  4. Could not load file or assembly 'AjaxControlToolkit' or one of its dependencies

    Could not load file or assembly 'AjaxControlToolkit' or one of its dependencies. API 调用退出异常. (Except ...

  5. WordPress后台添加侧边栏菜单

    add_action('admin_menu', 'register_custom_menu_page'); function register_custom_menu_page() { add_me ...

  6. Leetcode 472.连接词

    连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat" ...

  7. Leetcode 430.扁平化多级双向链表

    扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁 ...

  8. JAVA-STRUTS-2x的项目配置

    首先是web.xml的配置,这个是项目加载的开始. <display-name></display-name> <!--struts2配置开始--> <fil ...

  9. linux基础(Vi编辑器)

    整理的linux vi编辑器命令 Vi编辑器,进入方式,输入vi file即可进入编辑模式 1.vi模式(Linux严格区分大小写) Vi所学到的几种模式 模式 主要用途 相应操作 对应命令 普通模式 ...

  10. Python web 周总结

    按顺序查询 order_by()    order_by(- ) 下拉框默认显示 <select name="canteen_type_id" id="" ...