【java】RC4加密转16进制获取长度为40的不重复优惠码字符串 【未优化版本】
2018-01-31 16:40
1871 查看
需求:需要一串给各机构独有的优惠码
间接需求:固定长度、不重复、没有规律可循
实现思想如下:
1.首先获取一个UUID
2.去除UUID中的“-”
3.小写转大写
4.获取一个固定长度字符串
5.按照RC4加密算法获取到加密之后的字符串【这里给固定密钥】
6.将加密之后的字符串转化成16进制字符串
7.最后测试,是否会重复
完整代码如下:
【GitHub地址:https://github.com/AngelSXD/myagenorderdiscount】
View Code
最后如果愿意,可以自己封装成jar供项目使用,打包给maven使用的引用教程如下:http://www.cnblogs.com/sxdcgaq8080/p/8126770.html
================================================================================================================
【优化版代码地址:https://github.com/AngelSXD/RC4】
间接需求:固定长度、不重复、没有规律可循
实现思想如下:
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】
相关文章推荐
- java获取指定长度随机数(版本1)
- java 获取字符串安全截取长度
- java获取16进制的byte[]的String内容以及获取普通字符串的16进制的byte[]
- java获取一个字符串字节长度
- xcode7.1.1版本中,swift获取字符串长度
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串
- java获取两个字符串中最大相同子串。第一个动作:将短的那个串进行长度一次递减的子串打印
- [java]ActionEvent事件:获取输入字符串的长度
- java按照字节长度获取字符串长度
- 加密:Java利用MessageDigest获取字符串或文件MD5详解
- JAVA 生成不重复订单号 优化版本 订单号格式为yyyymmdd后面自增
- [leetcode]获取字符串中字符不重复的最长子串的长度
- java-最大不重复字符串长度
- java 获取一定长度的随机字符串 可用于生成交易订单号交易号等
- Java:字符串简单加密专成16进制在转回来
- [java]ActionEvent事件:获取输入字符串的长度
- linux 学习20170726 查看进程号及环境变量、获取字符串长度及shell版本
- Java 中正确获取中文字符串长度
- java 获得字符串中最大重复子串长度
- 重复字符串的判定问题(kmp 算法之优化版本)