在实际开发中,我们经常会批量生成二维码,而二维码实际就是一个链接,链接中就包含了随机的字符串。
方法一:MD5(时间戳的毫秒值+时间戳的纳秒值),然后截取需要的位数
public class QrCode {
public static String randomStr() {
//二维码前缀,即访问地址
String baseStr = "http://xxx.xxx.xxx/xxx";
//毫秒级
long str1 = System.currentTimeMillis();
//纳秒级
long str2 = System.nanoTime();
String str = Long.toString(str1 + str2);
// MD5加密
String re = MD5Util.encrypt(str);
// 所有字符串转成大写
return baseStr + re.toUpperCase().substring(4);
}
@Test
public void main() {
for (int i = 0; i < 1000; i++) {
System.out.println(randomStr());
}
}
}
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
public final static String encrypt(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
byte [] byteInput = s.getBytes();
//获取MD5摘要算法的MessageDigest对象
try {
MessageDigest mdInst = MessageDigest.getInstance("MD5");
//使用指定的字节更新摘要
mdInst.update(byteInput);
//获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char str[] = new char[j *2]; //char占两个字节
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf]; //右移四位,高四位清空 取低四位的值
}
return new String(str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}
方法二:参考:https://blog.csdn.net/li_magic/article/details/53215234
public class InvitationCode {
public static String generateRandomStr(int len) {
//字符源,可以根据需要增减
String generateSource = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
String rtnStr = "";
for (int i = 0; i < len; i++) {
//循环随机获得当次字符,并移走选出的字符
String nowStr = String.valueOf(generateSource.charAt((int) Math.floor(Math.random() * generateSource.length())));
rtnStr += nowStr;
generateSource = generateSource.replaceAll(nowStr, "");
}
rtnStr = "http://xxx.xxx.xxx/xxx;
return rtnStr;
}
@Test
public void main() {
for (int i = 0; i < 1000; i++) {
System.out.println(generateRandomStr(28));
}
}
}
三:总结
通过以上的方法获取随机字符串,在需求量不那么大的时候一般是不会重复的。