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

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

实现思想如下:

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. MVC如何在解决方案下创建文件夹

    背景:为什么要在解决方案下创建文件夹? 比如,在开发过程中,会抽象出大量的公共方法,如数据库访问的方法.配置文件读取方法等等,将这些方法生成自己的DLL库文件,方便在其他的项目中进行复用.那么,这些方 ...

  2. apache 虚拟主机配置(根据不同的域名映射到不同网站)

    最近弄了台香港服务器做测试,Web服务器软件用的是Apache2.2,机器只有一台,ip只有一个,但是想测试几个站点,于是尝试了下Apache的虚拟主机配置.之前已经写过一篇博文了——<Apac ...

  3. python-高级编程-07-端口

    TCP和UDP协议中都有端口这个概念,但是端口却不是IP协议的一部分 端口的出现主要是为了给协议栈和应用对应 .协议栈端口号将数据分配给不同的应用程序 .应用层程序用端口号去区分不同的链接 TCP 和 ...

  4. Leetcode 466.统计重复个数

    统计重复个数 定义由 n 个连接的字符串 s 组成字符串 S,即 S = [s,n].例如,["abc", 3]="abcabcabc". 另一方面,如果我们可 ...

  5. 2017"百度之星"程序设计大赛 - 初赛(A)

    小C的倍数问题  Accepts: 1990  Submissions: 4931  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 327 ...

  6. failed to allocate for range 0: no IP addresses available in range set: 172.20.xx.1-172.20.xx.254

    今天遇到一个机器上的Pod 在创建以后一直处于Init 0/1的状态,进到这个节点查看其kubelet的状态,发现果然有问题 systemctl status kubelet .go:] Contai ...

  7. C# ORM框架

    SQLSUGAR http://www.codeisbug.com/Doc/8/1159 附带mysql工具类,最优使用上面sqlsugar using System; using System.Co ...

  8. 完全平方数(bzoj 2440)

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是 ...

  9. vue.js源码学习分享(四)

    /** * Generate a static keys string from compiler modules.//从编译器生成一个静态键字符串模块. */ function genStaticK ...

  10. 在 POSIX 线程编程中避免内存泄漏

    检测和避免 POSIX 线程内存泄漏的技巧 POSIX 线程(pthread)编程定义了一套标准的 C 编程语言类型.函数和常量 — 且 pthreads 提供了一种强大的线程管理工具.要充分使用 p ...