我做了这样的事情,但没有工作.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)
在任何情况下我都不会得到重复的值.
由于生日悖论,不可能100%保证唯一值(特别是给定7个字符的字符串).由于包含48个字符的字符集,随机选择7,你必须后才110000随机值发生碰撞的几率1%.
您可以通过做两件事来帮助缓解这个问题.
使用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)