最近项目需求,需要生成10位不重复的字母+数字组合。开始时将数据向数据库中插入。再插入的时候需要跟数据库一个个的比对。非常慢。就想,如果前四位前缀固定的话,每次插入前,查询数据库是否存在这个前缀,不存在的话,才可以向数据库插入。
/**
* 生成一个10位的兑换码,大写字母数字组合
*/
private static String generateGiftCode(String prefix){
StringBuffer sb = new StringBuffer();
sb.append(prefix);
for(int i = 0;i < 10-prefix.length(); i++){
Random random = new Random();
String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
if("char".equalsIgnoreCase(charOrNum)){
int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
char val = (char)(choice + random.nextInt(26));
sb.append(val);
}else if("num".equalsIgnoreCase(charOrNum)){
int num = random.nextInt(9);
sb.append(num);
}
}
return sb.toString();
}
@Override
@Transactional
public void sendCode(int gid, int pid, String creDate,
String expireDate, int status, int codeNum, String prefix) {
Set<String> set = new HashSet<String>();
while(set.size() < codeNum){
set.add(generateGiftCode(prefix));
}
List<Code> list = new ArrayList<Code>();
for(String c : set){
Code code = new Code();
Code.setGid(gift_id);
Code.setPid(platform_id);
Code.setCreDate(str2date(cre_date));
Code.setExpireDate(str2date(expire_date));
Code.setStatus(status);
Code.setCode(c);
list.add(code);
}
giftCode.insertCode(list);
}