我使用以下代码创建一个8字符的唯一ID(包括数字和字母数字字符)。
try {
List<String> uuidList = new ArrayList<String>();
int counter = 1;
File file = new File("D://temp//temp1.txt");
file.createNewFile();
Writer writer = new FileWriter(file);
BufferedWriter wr = new BufferedWriter(writer);
while(true) {
int length = bitsArray.length;
Random r = new Random();
StringBuffer uuid = new StringBuffer();
for(int i= 0; i < 8; i++) {
int nextRandomId = r.nextInt(length);
uuid.append(bitsArray[nextRandomId]);
}
String uuidString = uuid.toString();
wr.write(uuidString);
wr.newLine();
if(counter != 1 && uuidList.contains(uuidString)) {
Thread.sleep(1000);
System.err.println(counter);
break;
}
//061e735145fc
System.err.println(uuidString);
uuidList.add(uuidString);
counter++;
}
} catch (Exception e) {
}
我需要知道,如果我使用上面的代码..那么我可以生成多少个唯一ID。给定
static String[] bitsArray = {"a","b","c","d","e","f","g","h","i",
"j","k","l","m","n","o","p","q","r",
"s","t","u","v","w","x","y","z",
"0","1","2","3","4","5","6","7","8","9"};
请帮助..
答案 0 :(得分:8)
本质上你可以生成 36 8 总字符串。
使用Discrete Mathematics(使用位串)解释此定理:
你有8个字符的位字符串,你需要填写36个字符中的1个:
__ __ __ __ __ __ __ __
36 36 36 36 36 36 36 36 (characters a -- z, 0-- 9)
因此,您有36*36*36*36*36*36*36*36
= 36 8 = 2,821,109,907,456
总ID。
答案 1 :(得分:2)
(26 + 10)^ 8 = 2 821 109 907 456
答案 2 :(得分:2)
看看这里:
第Permutations with Repetition
节。理论上,给定一组n
元素(即bitsArray
的长度)和置换长度(即uuidString
字符串)为r
,您将成为能够生成n ^ r个唯一排列(即您的情况下的UUID)。
在你的情况下,n = 36(26个字母和10个数字)和r = 8(uuid的长度是8),所以它是:
36^8 = 2821109907456
答案 3 :(得分:2)
有多少个唯一ID?大约一百万。这取决于您使用的随机数生成器的质量。如果是随机数生成器always returns 4,则只能生成一个标识符。如果它是一个低质量的线性同余生成器(对于较低位具有非常差的随机性),最终可能会比理论最大值(即36 8 =约2800亿)的值减少256倍。但是,由于您生成的每个ID都需要读取以前生成的ID的完整列表,因此我怀疑您的计算机只会在达到一百万个标识符之前将其自身排除在外。
有多少UUID?零。您的代码依赖于内部黑名单以避免冲突,这意味着使用您的方法生成UUID的几台计算机有相当合理的机会结束冲突(避免冲突是首先使用UUID的整个过程)。
答案 4 :(得分:0)
[number of possible char]^[lenght of the generatet id]
- 非常简单的数学
在你的情况下:
36^8 = 2821109907456
答案 5 :(得分:-1)
数组的长度是36.你使用方法r.nextInt(length)
这意味着随机数的最大值是36,从0到35.所以最多可以获得8个索引36。