【发布时间】:2011-12-27 06:51:41
【问题描述】:
嗯,我一直在寻找在 java 代码中生成 UID 的方法(其中大多数也进入了 stackoverflow)。最好是使用 java 的 UUID 来创建唯一的 id,因为它使用时间戳。但我的问题是它是 128 位长,我需要一个较短的字符串,比如 14 或 15 个字符。因此,我设计了以下代码。
Date date = new Date();
Long luid = (Long) date.getTime();
String suid = luid.toString();
System.out.println(suid+": "+suid.length() + " characters");
Random rn = new Random();
Integer long1 = rn.nextInt(9);
Integer long2 = rn.nextInt(13);
String newstr = suid.substring(0, long2) + " " + long1 + " " + suid.subtring(long2);
System.out.println("New string in spaced format: "+newstr);
System.out.println("New string in proper format: "+newstr.replaceAll(" ", ""));
请注意,我只是显示间隔格式和格式正确的字符串,仅用于与原始字符串进行比较。
这能保证每次都有 100% 的唯一 ID 吗?或者你认为这些数字有可能重复吗?此外,我可以在开始或结束时将随机数插入“可能”创建重复数字的随机位置,而不是插入。这是为了完成我的 UID 所需的长度。尽管如果您需要少于 13 个字符的 UID,这可能不起作用。
有什么想法吗?
【问题讨论】:
-
当然不能保证任何 ID 是唯一的——毕竟,ID 集是有限的,您可以查看任意次数。 (当然,这对 128 但 UUID 也有效。)
-
而且,你的ID越小,碰撞的概率就越大。所以基本上你应该选择更长的ID,如果你希望你的概率很低。
-
但时间戳始终是唯一的,除非您在几分之一秒内发出两个请求,这不太可能。这与随机一起应该会增加始终唯一的可能性。
-
您可能会感到惊讶,但时间戳也不是唯一的。 :) 您的时间戳类型有多大? 16位?在任何 2^16 + 1 个时间戳值中,至少会有两个相等的值。
-
好吧。我的不是确切意义上的“时间戳”。 Date.getTime() 是毫秒数。这个不会在一个上限之后重复,不是吗? (可能是一个愚蠢的问题:P)
标签: java random uniqueidentifier uid unique-id