如何生成随机的7个字符的字母数字字符串?

She*_*ram 2 java

我做了这样的事情,但没有工作.base48Encode方法参数我以毫秒为单位通过了当前系统时间

private static final String CHARACTER_SET = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";

public static String base48Encode(double d) {
    Double num = Double.valueOf(d);
    Integer length = CHARACTER_SET.length();
    String encodeString = new String();
    while (num > length) {
        encodeString = CHARACTER_SET.charAt(num.intValue() % length) + encodeString;
        num = Math.ceil(new Double(num / length) - 1);
    }
    encodeString = CHARACTER_SET.charAt(num.intValue()) + encodeString;

    return encodeString;
}
Run Code Online (Sandbox Code Playgroud)

Syo*_*yon 5

在任何情况下我都不会得到重复的值.

由于生日悖论,不可能100%保证唯一值(特别是给定7个字符的字符串).由于包含48个字符的字符集,随机选择7,你必须后才110000随机值发生碰撞的几率1%.

您可以通过做两件事来帮助缓解这个问题.

  1. 使用更大的字符集.
  2. 增加随机值的长度.

使用64个字符的字符集并随机选择10将大大降低您发生碰撞的几率,在160,000,000个随机值后降至1%.

currentTimeMillis如果您在同一毫秒内生成两个值,而不是使用生成一个会导致冲突的值,我建议只使用Random该类(从当前时间播种到纳秒).

private static final String CHARACTER_SET = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
private static Random rnd = new Random();

public static String randomString(int length){
    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < length; i++){
        builder.append(CHARACTER_SET.charAt(rnd.nextInt(CHARACTER_SET.length())));
    }
    return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)