【发布时间】:2013-04-19 03:00:06
【问题描述】:
我正在准备一个 Java 库,该库需要为生成的对象分配一个唯一的 id 以进行序列化。 生成唯一 id 后,我必须确保下次使用该库时,不可能将 id 重新分配给我过去保存的对象。
现在,我看到 Stackoverflow 中的许多人建议依赖几个选项,即 UUID、SecureRandom,但我不确定这些课程是否适合我的需要,我'不知道如何使用它们。
请问,您能否介绍一下要使用的正确实用程序以及如何生成 id?
欢迎使用基于 Guava/Apache 实用程序的解决方案。
【问题讨论】:
-
你为什么不使用原子长?它可以以线程安全的方式为您提供next value。数据库序列也可以。这些 ID 是从同一台机器分配的吗?他们应该多快?是否需要字母数字 ID?
-
我会按顺序回答。 A1) 据我所知,AtomicLong 只是 Long 的线程安全版本,因此我无法保证第二次使用该库时新的 int 是唯一的。 A2) id 分配理论上来自同一台机器,但是如果我反序列化从另一台机器保存的对象会发生什么? A3) 快,我对效率没有要求。 A4) 不是很重要!重要的是它们必须是独一无二的。
-
您对
AtomicLong的观察以及重新启动时丢失最后一个序列是正确的。如果您需要跨多个程序调用的唯一 ID,请使用数据库序列。您可以要求数据库缓存序列的下 N 个数字,以使其合理快速,并且该值将在调用之间保持不变。 -
@DeepakBala 所以,我应该在我的应用程序中嵌入这样的数据库,比如 Apache Derby。或者,否则,我需要将最后一个 id 保存到文件中。不是吗?但是 UUID 和 SecureRandom 呢?人们对这些课程赞不绝口!
-
生成重复 UUID 的概率为pretty low。我不知道不同机器上的 2 个 UUID 实例生成相同 ID 的可能性,但是 UUID 在 JVM 中应该是唯一的。我不会为了生成 UUID 而嵌入数据库的麻烦。您可以安全地使用 java
UUID。如果说您想知道生成了多少个 ID 等,我认为数据库可能会很方便。
标签: java uuid id-generation