【问题标题】:Secure ID in Java with persistency具有持久性的 Java 中的安全 ID
【发布时间】:2013-04-19 03:00:06
【问题描述】:

我正在准备一个 Java 库,该库需要为生成的对象分配一个唯一的 id 以进行序列化。 生成唯一 id 后,我必须确保下次使用该库时,不可能将 id 重新分配给我过去保存的对象。

现在,我看到 Stackoverflow 中的许多人建议依赖几个选项,即 UUIDSecureRandom,但我不确定这些课程是否适合我的需要,我'不知道如何使用它们。

请问,您能否介绍一下要使用的正确实用程序以及如何生成 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


【解决方案1】:

生成重复 UUID 的概率为pretty low。我不知道不同机器上的 2 个 UUID 实例生成相同 ID 的可能性,但是 UUID 在 JVM 中应该是唯一的。我不会为了生成 UUID 而嵌入数据库的麻烦。您可以安全地使用 java UUID

替代解决方案

如果您需要跨多个程序调用的唯一 ID,请使用数据库序列。您可以要求数据库缓存序列的下 N 个数字,以使其合理快速,并且该值将在调用之间保持不变。 UUID 使用起来更方便,但两种解决方案都可以使用。如果您使用数据库,您将了解已序列化的对象数量。

【讨论】:

    【解决方案2】:

    如果您的对象需要一个唯一的编号,那么为什么不只是做一个序列。您必须编写一个执行以下操作的自定义类:

    • 这将是一个单身人士
    • 找到对象在启动时使用的最后一个值
    • 有一个像 getNext 这样的方法,它递增 lastValue 并返回要由对象使用的值。
    • 使其线程安全。

    【讨论】:

    • 但是当我同时运行同一个库两次时,这并不安全,例如在同一台计算机上。事实上,每个类都会读取最后一个 id,然后他们会分配顺序 id,保存时我会找到具有相同 id 的序列化对象!我相信迪帕克巴拉明白了这一点。我应该使用内部数据库,它将充当多个应用程序之间的同步点。不是最快的解决方案,但并不重要!
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多