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

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

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

实现思想如下:

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);

    }
}
View Code

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

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

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

原文地址:https://www.cnblogs.com/sxdcgaq8080/p/8393111.html