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

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

实现思想如下:

1.首先获取一个UUID

2.去除UUID中的“-”

3.小写转大写

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

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

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

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

完整代码如下:

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

  1. package testExample;
  2.  
  3. import org.junit.Test;
  4. import java.util.*;
  5.  
  6. public class RC4 {
  7.  
  8. @Test
  9. public void RC4(){
  10. List<String> list = new ArrayList<>();
  11. Set<String> set = new HashSet<>();
  12. System.out.println(System.currentTimeMillis());
  13. for(int i = 0 ; i < 1000000; i++){
  14. String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase().substring(0,16);
  15. String ss = RC42hex02(HloveyRC4(uuid,"angelSXD"));
  16. list.add(ss);
  17. set.add(ss);
  18. }
  19.  
  20. System.out.println("list长度:"+list.size());
  21. System.out.println("set长度:"+set.size());
  22. System.out.println(System.currentTimeMillis());
  23.  
  24. }
  25.  
  26. public static String RC42hex02(String str){
  27. final String HEX = "0123456789abcdef";
  28. StringBuffer stringBuffer = new StringBuffer();
  29. byte [] bytArr = str.getBytes();
  30. for (byte b : bytArr) {
  31. // 取出这个字节的高4位,然后与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
  32. stringBuffer.append(HEX.charAt((b >> 4) & 0x0f));
  33. // 取出这个字节的低位,与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
  34. stringBuffer.append(HEX.charAt(b & 0x0f));
  35. }
  36. return stringBuffer.toString();
  37. }
  38.  
  39. public static String HloveyRC4(String aInput,String aKey)
  40. {
  41. int[] iS = new int[256];
  42. byte[] iK = new byte[256];
  43.  
  44. for (int i=0;i<256;i++)
  45. iS[i]=i;
  46.  
  47. int j = 1;
  48.  
  49. for (short i= 0;i<256;i++)
  50. {
  51. iK[i]=(byte)aKey.charAt((i % aKey.length()));
  52. }
  53.  
  54. j=0;
  55.  
  56. for (int i=0;i<255;i++)
  57. {
  58. j=(j+iS[i]+iK[i]) % 256;
  59. int temp = iS[i];
  60. iS[i]=iS[j];
  61. iS[j]=temp;
  62. }
  63.  
  64. int i=0;
  65. j=0;
  66. char[] iInputChar = aInput.toCharArray();
  67. char[] iOutputChar = new char[iInputChar.length];
  68. for(short x = 0;x<iInputChar.length;x++)
  69. {
  70. i = (i+1) % 256;
  71. j = (j+iS[i]) % 256;
  72. int temp = iS[i];
  73. iS[i]=iS[j];
  74. iS[j]=temp;
  75. int t = (iS[i]+(iS[j] % 256)) % 256;
  76. int iY = iS[t];
  77. char iCY = (char)iY;
  78. iOutputChar[x] =(char)( iInputChar[x] ^ iCY) ;
  79. }
  80.  
  81. return new String(iOutputChar);
  82.  
  83. }
  84. }

最后如果愿意,可以自己封装成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. body标签相关

    03-body标签中相关标签   今日主要内容: 列表标签 <ul>.<ol>.<dl> 表格标签 <table> 表单标签 <fom> 一 ...

  2. Selenium WebDriver-操作单选框

    先判断按钮是否已经被选中 如果没有被选中,才可以点击 #encoding=utf-8 import unittest import time import chardet from selenium ...

  3. struts2和spring的两种整合方式

    首先,来看看如何让Spring 来管理Action. 在struts.xml中加入 <constant name="struts.objectFactory" value=& ...

  4. Mysql读写分离实例

    吐槽:前天刚加完MQ,这回加读写分离.我也是醉了,但是弄完之后,就发现,似乎没我想的那么复杂,真的!另外,昨天试了一下用swagger编写API文档,太方便了,加上Mock service测试.这两天 ...

  5. hibernate悲观锁,乐观锁

    业务逻辑的实现过程中,往往需要保证数据访问的排他性.因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无 ...

  6. java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()解决办法

    代码改变世界 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.pre ...

  7. hdu6074[并查集+LCA+思维] 2017多校4

    看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...

  8. Welcome-to-Swift-21协议(Protocols)

    协议定义了一个方法的蓝图,属性和其他适合特定任务或功能的要求.协议实际上并不提供一个这些要求的实现,它只是描述了一个实现会是什么样子.协议可以通过一个类,结构或枚举提供这些要求的具体实现.满足要求的任 ...

  9. linux JDK安装(一)

    1.先卸载服务器自带的jdk软件包# java -version #查看服务器是否安装过jdkjava version "1.6.0_17"OpenJDK Runtime Envi ...

  10. bzoj 2798 [Poi2012]Bidding 博弈论+dp

    题目大意 A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y). 初始时(x,y)=(1,0),可以进行三种操作: 将(x,y)变成(1,x+y). 将(x,y)变成(2x,y). 将( ...