Java Web应用程序中的唯一序列号
我一直在想什么是生成唯一ID的正确做法? 事情是在我的网络应用程序,我会有一个插件系统,当用户注册一个插件,我想为它生成一个唯一的序列号。 我一直在考虑将所有数字存储在服务器上的数据库或文件中,生成一个随机数并检查它是否已存在于数据库/文件中,但这看起来不太好。 还有其他方法可以做到吗? 将使用UUID是首选的方式吗?
如果这些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字节的机器ID,2字节的进程ID和3字节的计数器组成。 请注意,时间戳和计数器字段必须存储为大端,而不像BSON的其余部分
如果他们不是面向用户的,那么你可以把它留给数据库来做一个自动递增的ID:1,2,3等。
为什么不去找一个静态的(或者,在这种情况下是一个上下文范围的)AtomicInteger,当一个插件被注册时会增加?
你可以基于用户ID和时间戳,确保唯一性,但也提供了一定的“可读性”? 例如用户ID = 101,时间戳= 2010年12月23日13:54,你可以给它ID:
201012231354101
要么
101201012231354
另一种UUID显然保证是唯一的,但占用大量的数据库空间,而且使用起来相当笨拙。
最后的想法是询问你的中央数据库一个唯一的ID,例如Oracle有序列,或者MySQL使用AUTO_INCREMENT字段来分配唯一的整数。
链接地址: http://www.djcxy.com/p/91479.html