2

我做了这样的事情,但没有工作。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;
}
4

1 回答 1

5

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

由于生日悖论,不可能 100% 保证一个唯一值(尤其是给定一个 7 个字符的字符串) 。给定一个包含 48 个字符的字符集,随机选择 7 个,只有 110,000 个随机值后,您有 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();
}
于 2013-09-05T14:05:59.243 回答