如何在Java中生成固定长度的唯一标识符?

时间:2011-07-05 14:39:24

标签: java uniqueidentifier

我正在尝试生成固定长度的唯一标识符,例如Megaupload为上传的文件生成的ID。

例如:

  • ALGYTAB5
  • BCLD23A6

在本例中,使用A-Z和0-9,固定长度为8,总的不同组合为2,821,109,907,456。

如果已经生成了其中一个生成的ID,该怎么办?这些ID将存储在数据库中,不应多次使用。

如何在Java中实现这一目标?

谢谢。

5 个答案:

答案 0 :(得分:4)

嗯......你可以通过以下方式模仿较小的GUID。让你的字符串的前4个字节是编码的当前时间 - 在Unix之后传递的秒数。最后4只是随机组合。在这种情况下,两个ID重合的唯一方式是它们是在同一秒内构建的。由于其他4个随机字符,这种可能性很低。

伪代码:

get current time (4 byte integer
id[0] = 1st byte of current time (encoded to be a digit or a letter)
id[1] = 2nd
id[2] = 3rd
id[3] = 4th
id[4] = random character
id[5] = random character
id[6] = random character
id[7] = random character

答案 1 :(得分:1)

我已尝试过@ Armen的解决方案,但我想提供另一种解决方案

    UUID idOne = UUID.randomUUID();
UUID idTwo = UUID.randomUUID();
UUID idThree = UUID.randomUUID();
UUID idFour = UUID.randomUUID();

String time = idOne.toString().replace("-", "");
String time2 = idTwo.toString().replace("-", "");
String time3 = idThree.toString().replace("-", "");
String time4 = idFour.toString().replace("-", "");

StringBuffer data = new StringBuffer();
data.append(time);
data.append(time2);
data.append(time3);
data.append(time4);

    SecureRandom random = new SecureRandom();
int beginIndex = random.nextInt(100);       //Begin index + length of your string < data length
int endIndex = beginIndex + 10;            //Length of string which you want

String yourID = data.substring(beginIndex, endIndex);

希望这有帮助!

答案 2 :(得分:0)

我们正在使用数据库检查它们是否已存在。如果ID数量与可能的数量相比较低,则应该相对安全。

您可能还要查看UUID类(尽管它是16字节的UUID)。

答案 3 :(得分:0)

听起来像hash function的工作。您不是100%保证哈希函数将返回唯一标识符,但它在大多数情况下都有效。哈希碰撞必须单独处理,但有许多标准技术供你研究。

具体来说,处理冲突的方式取决于您使用此唯一标识符的内容。如果它是一个简单的单向标识符,您为程序提供ID并返回数据,那么您可以在发生冲突时使用下一个可用的ID。

答案 4 :(得分:0)

请按照以下步骤操作:

  1. generateId()
  2. 通过查询数据库检查它是否已经发出。
  3. 如果是,请再次调用generateId(),直到在db中找不到它为止。