zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    解决document.write问题
    js操作css样式
    最强大的对联广告,所有浏览器支持,ie6无抖动,缩放页面ie6没有横向滚动条
    JavaScript绘制图形Canvas
    DDD关键知识点整理汇总
    聚合(根)、实体、值对象精炼思考总结
    DDD领域驱动设计基本理论知识总结
    GVMStart 正常结果
    Ubuntu20.04安装、配置openvas 9
    VS Code MarkDown即时渲染编写插件
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/8393111.html
Copyright © 2011-2022 走看看