我假设UUID在128位范围内均匀生成。
首先,您的假设可能是不正确的,这取决于UUID类型(1、2、3或4)。根据Java UUID文档中的
说明:
存在不同种类的全局标识符。该类的方法用于操作Leach-Salz变体,但构造函数允许创建任何UUID变体(如下所述)。
变体2(Leach-Salz)UUID的布局如下:最高有效位包含以下无符号字段:
0xFFFFFFFF00000000 time_low
0x00000000FFFF0000 time_mid
0x000000000000F000 version
0x0000000000000FFF time_hi
最不重要的长整型由以下无符号字段组成:
0xC000000000000000 variant
0x3FFF000000000000 clock_seq
0x0000FFFFFFFFFFFF node
变体字段包含一个值,用于标识UUID的布局。上面描述的位布局仅适用于具有变体值2的UUID,该值指示Leach-Salz变体。
版本字段保存一个值,描述此UUID的类型。有四种不同基本类型的UUID:基于时间、DCE安全、基于名称和随机生成的UUID。这些类型的版本分别为1、2、3和4。
做你正在做的事情的最佳方法是使用类似以下代码的方式生成随机字符串(source):
public class RandomString {
public static String randomstring(int lo, int hi){
int n = rand(lo, hi);
byte b[] = new byte[n];
for (int i = 0; i < n; i++)
b[i] = (byte)rand('a', 'z');
return new String(b, 0);
}
private static int rand(int lo, int hi){
java.util.Random rn = new java.util.Random();
int n = hi - lo + 1;
int i = rn.nextInt(n);
if (i < 0)
i = -i;
return lo + i;
}
public static String randomstring(){
return randomstring(5, 25);
}
public static void main(String[] args) {
System.out.println(randomstring());
}
}
如果您非常担心碰撞或其他问题,我建议您对UUID进行
base64
编码,这应该可以减小其大小。
故事的寓意是:不要依赖UUID的单个部分,因为它们是整体设计的。如果您确实需要依赖UUID的单个部分,请确保熟悉特定的UUID类型和实现。
http://tinyurl.com/2
和http://bit.ly/2
这样的网址的方式。 - Ky -