先做种子自己然后获取时间将时间转换为以种子长度为进制的码。
然后取出转换的结果长度并补充剩余的长度的随机码
最后将这随机码转换成数字并按数字获取种子中的随机码
(当然这进制要大于2小于36,我这里调用的api,没写特殊的转换进制)
在这里面误导调换,当长度大于9的时候会产生多的随机码,随机码种子可以是特殊符号。
有问题欢迎来喷。
/**
* @Fields digits : randomString的随机种子
*/
private static final char [] digits = "IWKSXM9Q7P8A1L3Z2U6E5J4D0NCYRHFNVTBG".toCharArray();
/**
* @Title: randomString
* @Description: 获取长度为9-36的唯一随机码
* @param length
* @return
* @return String
* @author 万事屋の小孩 QQ675509308
* @date 2014年12月2日 下午1:53:15
*/
public static String randomString(int length){
if (length < 1 ){
length = 1;
}
else if(length > 36){
length = 36;
}
String k = System.currentTimeMillis()+"";
int integermaxvaluelength = (Integer.MAX_VALUE+"").length();
StringBuffer key= new StringBuffer(Integer.toString(Integer.parseInt(k.substring(0,integermaxvaluelength)), digits.length));
key.append(Integer.toString(Integer.parseInt(k.substring(integermaxvaluelength)), digits.length));
//然后取出转换的结果长度
while(key.length() < length){
key.append(Integer.toString((int) (Math.random() * digits.length),digits.length));
}
char keyCodes [] = key.toString().substring(0,length).toCharArray();
key = null;
key = new StringBuffer();
//调换位置几次
for(int z = 0 ; z < 3;z++){
StringBuffer keyCodesStrO = new StringBuffer();
StringBuffer keyCodesStrE = new StringBuffer();
for(int i = 0 ; i < keyCodes.length; i++){
if(i % 2 == 0){
keyCodesStrO.append(String.valueOf(keyCodes[i]));
}else{
keyCodesStrE.append(String.valueOf(keyCodes[i]));
}
}
keyCodesStrO.append(keyCodesStrE.toString());
keyCodesStrE = null;
keyCodes = keyCodesStrO.toString().toCharArray();
keyCodesStrO = null;
}
for(char c: keyCodes){
key.append(String.valueOf(digits[Integer.parseInt(String.valueOf(c),digits.length)]));
}
return key.toString();
}
public static void main(String[] args) {
System.out.println(randomString(10));
}