一 实例
/**
* 生成随即4位随机数
*/
public String getRandomNum() {
return (int) ((Math.random() * 9 + 1) * 1000) + "";
}
二 生成随机串
/**
* 根据用户id生成不重复邀请码 小于id 754137930为6位,超出后邀请码位数将大于6
**/
public class generateCode {
/** 邀请码最小长度,生成邀请码小于该字段,自动补长 **/
private static final int MIN_CODE_LENGTH_1 = 10;
/** 位数不足时,充当分隔,该字段为保持唯一性,不放入下方的列表 **/
private static final String STOP_CHAR_1 = "0";
private static final String[] CHARS_1 = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"};
/** 兑换码最小长度,生成邀请码小于该字段,自动补长 **/
private static final int MIN_CODE_LENGTH_2 = 8;
/** 位数不足时,充当分隔,该字段为保持唯一性,不放入下方的列表 **/
private static final String STOP_CHAR_2 = "U";
private static final String[] CHARS_2 = new String[]{"Q","W","E","8","A","S","2","D","Z","X","9","C","7","P","5","K","3","M","J","F","R","4","V","Y","L","T","N","6","B","G","H"};
/**
* 默认使用配置一
* */
private static int MIN_CODE_LENGTH = MIN_CODE_LENGTH_1;
private static String STOP_CHAR = STOP_CHAR_1;
private static String[] CHARS = CHARS_1;
private static int OFFSET = CHARS_1.length - 1;
public generateCode(int type) {
if (type == 2) {
// 兑换码
MIN_CODE_LENGTH = MIN_CODE_LENGTH_2;
STOP_CHAR = STOP_CHAR_2;
CHARS = CHARS_2;
OFFSET = CHARS_2.length - 1;
}
}
/**
* 根据 id 生成邀请码
* 如果是 6 位的邀请码只能支持 754137930 7亿5千万用户, 超出的id 会成为7位甚至更长的邀请码
* @param id 用户id
* @return 邀请码字符串
*/
public static String id2ShareCode(long id, Integer codeMinLength) {
if (codeMinLength == null) {
codeMinLength = MIN_CODE_LENGTH;
}
String code = int2chars(id);
int tailLength = codeMinLength - code.length();
if (tailLength > 1) {
code = code + STOP_CHAR + codeTail(tailLength - 1);
} else if (tailLength == 1) {
code = code + STOP_CHAR;
}
return code;
}
/**
* 根据 id 生成邀请码
* 如果是 6 位的邀请码只能支持 754137930 7亿5千万用户, 超出的id 会成为7位甚至更长的邀请码
* @param id 用户id
* @return 邀请码字符串
*/
public String id2ShareCode(long id) {
int codeMinLength = MIN_CODE_LENGTH;
String code = int2chars(id);
int tailLength = codeMinLength - code.length();
if (tailLength > 1) {
code = code + STOP_CHAR + codeTail(tailLength - 1);
} else if (tailLength == 1) {
code = code + STOP_CHAR;
}
return code;
}
/**
* 根据邀请码 获取 id
* @param code 邀请码
* @return 用户id
*/
public static long shareCode2id(String code) {
int inx = code.indexOf(STOP_CHAR);
if (inx > 0) {
code = code.substring(0, inx);
}
return chars2int(code);
}
/**
* 获取补长的邀请码(随机)
* @param len 需要的长度
* */
private static String codeTail(int len) {
String res = "";
Random r = new Random();
for (int i = 0; i < len; i++) {
res += CHARS[r.nextInt(OFFSET)];
}
return res;
}
private static String int2chars(long id) {
long x = id / OFFSET;
long remainder = id % OFFSET;
if (x == 0) {
return CHARS[(int) id];
} else if (x < OFFSET) {
return CHARS[(int) x] + CHARS[(int) remainder];
} else {
return int2chars(x) + CHARS[(int) remainder];
}
}
private static long chars2int(String chars) {
long res = 0;
int codeLen = chars.length();
List<String> totalCharsList = Arrays.asList(CHARS);
for (int i = 0; i < codeLen; i++) {
String a = chars.substring(i, i+1);
if (STOP_CHAR.equals(a)) {
break;
}
if (totalCharsList.contains(a)) {
// res += (long) totalCharsList.indexOf(a) * (Math.pow(OFFSET, (codeLen - i - 1)));
res = res * OFFSET + totalCharsList.indexOf(a);
} else {
res = 0;
break;
}
}
return res;
}
}
二 生成随机串的问题
由于STOP_CHAR为静态变量,初始值为STOP_CHAR_1 = "0",但是在满足type=2的时候STOP_CHAR 重新被赋值为STOP_CHAR_2="U",此时如果再使用不满足type=2的条件的时候,按常理来说STOP_CHAR的值应该为STOP_CHAR_1 = "0",两次使用同一个对象的时候,此时的STOP_CHAR值仍然为STOP_CHAR_2="U"。
部分修改
private static int MIN_CODE_LENGTH = 0;
private static String STOP_CHAR = "";
private static String[] CHARS = ""
private static int OFFSET = "";
public generateCode(int type) {
if (type == 1) {
// 7位字符串
MIN_CODE_LENGTH = MIN_CODE_LENGTH_1;
STOP_CHAR = STOP_CHAR_1;
CHARS = CHARS_1;
OFFSET = CHARS_1.length - 1;
}
if (type == 2) {
// 兑换码
MIN_CODE_LENGTH = MIN_CODE_LENGTH_2;
STOP_CHAR = STOP_CHAR_2;
CHARS = CHARS_2;
OFFSET = CHARS_2.length - 1;
}
}
或者
private static int MIN_CODE_LENGTH = 0;
private static String STOP_CHAR = "";
private static String[] CHARS = ""
private static int OFFSET = "";
public generateCode() {
// 7位字符串
MIN_CODE_LENGTH = MIN_CODE_LENGTH_1;
STOP_CHAR = STOP_CHAR_1;
CHARS = CHARS_1;
OFFSET = CHARS_1.length - 1;
}
public generateCode(int type) {
// 兑换码
MIN_CODE_LENGTH = MIN_CODE_LENGTH_2;
STOP_CHAR = STOP_CHAR_2;
CHARS = CHARS_2;
OFFSET = CHARS_2.length - 1;
}
待后续一一分析,如有问题,希望读者留言告知,谢谢!