java Web应用程序中的唯一序列号

时间:2010-12-23 13:47:06

标签: java java-ee guid uuid uniqueidentifier

我一直想知道生成唯一ID的正确做法是什么?事情是在我的网络应用程序中我将有一个插件系统,当用户注册一个插件我想为它生成一个唯一的序列ID。我一直在考虑将所有数字存储在数据库或服务器上的文件中,生成随机数并检查它是否已存在于数据库/文件中,但这似乎不太好。还有其他方法吗?使用UUID是首选方式吗?

3 个答案:

答案 0 :(得分:7)

如果id是面向用户的,它们似乎是,那么你希望它们难以猜测。使用内置的UUID类,它为您生成随机ID,并且可以很好地为您格式化它们。提取物:

UUID idOne = UUID.randomUUID();
UUID idTwo = UUID.randomUUID();
log("UUID One: " + idOne);
log("UUID Two: " + idTwo);

示例输出:

UUID One: 067e6162-3b6f-4ae2-a171-2470b63dff00 
UUID Two: 54947df8-0e9e-4471-a2f9-9af509fb5889

提供的链接中还有其他解决方案。我认为它很好地比较了这些方法,因此请选择最适合您需求的方法。

另一种有趣的方法是MongoDB使用的一种方法,但这可能对您的需求有些过分:

  

BSON ObjectID是12字节的值   由4字节时间戳组成   (自纪元以来的秒数),一个3字节   machine id,一个2字节的进程id和a   3字节计数器。请注意   时间戳和计数器字段必须是   与其余的不同,存储大端   BSON

如果他们不是面向用户,那么您可以将其留给数据库以执行自动递增ID:1,2,3等。

答案 1 :(得分:0)

为什么不去静态(或者,在这种情况下,是一个上下文作用域)AtomicInteger,当插件被注册时会增加?

答案 2 :(得分:0)

您可以将其基于用户ID和时间戳,确保唯一性,同时提供一定的“可读性”?例如。用户ID = 101,时间戳= 2010年12月23日13:54,你可以给它ID:

201012231354101

101201012231354

替代的UUID显然是唯一的,但占用了大量的数据库空间,并且使用起来非常笨拙。

最后一个想法是向您的中央数据库询问一个唯一的ID,例如Oracle有序列,或者MySQL使用AUTO_INCREMENT字段来分配唯一的整数。