【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); }
}
最后如果愿意,可以自己封装成jar供项目使用,打包给maven使用的引用教程如下:http://www.cnblogs.com/sxdcgaq8080/p/8126770.html
================================================================================================================
【优化版代码地址:https://github.com/AngelSXD/RC4】
【java】RC4加密转16进制获取长度为40的不重复优惠码字符串 【未优化版本】的更多相关文章
- java byte数组与16进制间的相互转换
java byte数组与16进制间的相互转换 CreationTime--2018年6月11日15点34分 Author:Marydon 1.准备工作 import java.util.Array ...
- Java中char转为16进制
Java中char转为16进制 char a = '0'; String hexStr = Integer.toHexString(a); System.out.println(hexStr);
- Java中byte与16进制字符串的互换原理
我们都知道Java中的byte是由8个bit组成的,而16进制即16中状态,它是由4个bit来表示的,因为24=16.所以我们可以把一个byte转换成两个用16进制字符,即把高4位和低4位转换成相应的 ...
- Java中byte与16进制字符串的互相转换
* Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串. * @param s ...
- [转]Java中byte与16进制字符串的互相转换
Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符, ...
- Java对文件的16进制读取和操作
大家可以参考一下源代码的相关部分注释,然后写出自己的16进制处理程序.有几个重点地方: 16进制字符串->10进制数 int input = Integer.parseInt("Str ...
- java字节数组和16进制之间的转换
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ pac ...
- Java 将数字转为16进制,然后转为字符串类型
public class ArrayTest3 { public static void main(String[] args){ System.out.println(toHex(60)); } / ...
- java中byte[] 和16进制字符串互转
//将byte[]转换为16进制字符串 public static String byte2hex(byte[] b) { StringBuilder hs = new StringBuilder() ...
随机推荐
- nmap命令扫描存活主机
1.ping扫描:扫描192.168.0.0/24网段上有哪些主机是存活的: [root@laolinux ~]# nmap -sP 192.168.0.0/24 Starting Nmap 4. ...
- private virtual in c++
source from http://blog.csdn.net/steedhorse/article/details/333664 // Test.cpp #include <iostream ...
- Ubuntu下安装anaconda和pycharm
折腾了一上午,终于装好了,如下:Python环境的安装: 安装anaconda 建议去https://www.anaconda.com/download/#linux直接用Ubuntu界面的搜狐浏览器 ...
- luogu3371 【模板】单源最短路径 dijkstra堆优化
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> ...
- python - 自动化测试框架 - 测试报告
testSuitr.py: # -*- coding:utf-8 -*- '''@project: Voctest@author: Jimmy@file: testSuite.py@ide: PyCh ...
- LoadRunner 手动关联
步骤: 1.同样的流程录制两遍,保存在不同的项目中, 2.点击Tools >> Compare with Script 3.选择要比对的脚本 3.找辨识码 4.打开辨识码所在网页,查看源代 ...
- 缓存淘汰算法之LRU实现
Java中最简单的LRU算法实现,就是利用 LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可 如果你去看LinkedHashMap的源码可知,LR ...
- 九度oj 题目1494:Dota
题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备. 为了简化问题,我们将每个装备对于英雄的功能抽象为一 ...
- 九度oj 题目1374:所有员工年龄排序
题目描述: 公司现在要对所有员工的年龄进行排序,因为公司员工的人数非常多,所以要求排序算法的效率要非常高,你能写出这样的程序吗? 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一 ...
- Git使用规范流程(转载)
作者: 阮一峰 日期: 2015年8月 5日 团队开发中,遵循一个合理.清晰的Git使用流程,是非常重要的. 否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护. 下面是Th ...