Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中具有持久性的安全ID_Java_Uuid_Id Generation - Fatal编程技术网

Java中具有持久性的安全ID

Java中具有持久性的安全ID,java,uuid,id-generation,Java,Uuid,Id Generation,我正在准备一个Java库,它需要为生成的对象分配一个唯一的id,以实现序列化。 生成唯一id后,我必须确保下次使用库时,无法将id重新分配给我过去已保存的对象 现在,我看到Stackoverflow中的许多人建议依赖几个选项,例如,但我不确定这些类是否适合我的需要,也不确定如何使用它们 请告诉我要使用的正确工具以及如何生成id? 欢迎使用基于Guava/Apache实用程序的解决方案。如果您的对象需要一个唯一的数字,那么为什么不直接执行序列呢。您必须编写一个执行以下操作的自定义类: 这将是一个

我正在准备一个Java库,它需要为生成的对象分配一个唯一的id,以实现序列化。 生成唯一id后,我必须确保下次使用库时,无法将id重新分配给我过去已保存的对象

现在,我看到Stackoverflow中的许多人建议依赖几个选项,例如,但我不确定这些类是否适合我的需要,也不确定如何使用它们

请告诉我要使用的正确工具以及如何生成id?


欢迎使用基于Guava/Apache实用程序的解决方案。

如果您的对象需要一个唯一的数字,那么为什么不直接执行序列呢。您必须编写一个执行以下操作的自定义类:

  • 这将是一个单身汉
  • 找到启动时对象使用的最后一个值
  • 有一个像getNext这样的方法,它增加lastValue并返回对象要使用的值
  • 确保线程安全

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

替代解决方案


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

为什么不使用原子长度?它可以以线程安全的方式获取。数据库序列也可以。这些ID是从同一台机器分配的吗?他们应该多快?是否需要字母数字标识?我将按顺序回答。A1)据我所知,AtomicLong只是Long的线程安全版本,因此我无法保证在第二次使用该库时新的int是唯一的。A2)理论上,Id分配来自同一台机器,但如果我反序列化从另一台机器保存的对象,会发生什么?A3)速度快,我对效率没有要求。A4)不是很重要!重要的是它们必须是唯一的。您对
AtomicLong
和重新启动时丢失最后一个序列的观察是正确的。如果在程序的多次调用中需要唯一的ID,请使用数据库序列。您可以要求DB缓存序列的下N个数字,使其速度合理,并且该值将在调用过程中保持不变。@DeepakBala因此,我应该在我的应用程序中嵌入这样一个DB,如Apache Derby。否则,我需要将最后一个id保存到一个文件中。不是吗?但是UUID和SecureRandom呢?人们对这些课程评价很高!生成重复UUID的概率为。我不知道跨不同机器的2个UUID实例生成相同ID的可能性,但是UUID在JVM中应该是唯一的。我不会为了生成UUID而嵌入数据库。您可以安全地使用java
UUID
。我认为如果您想知道生成了多少ID等,DB可能会很方便。但如果我同时运行同一个库两次(例如,在同一台计算机上),这是不安全的。事实上,每个类将读取最后一个id,然后它们将分配顺序id,在保存时,我将找到具有相同id的序列化对象!我相信迪帕克·巴拉说得对。我应该使用一个内部数据库,它将充当多个应用程序之间的同步点。这不是最快的解决方案,但并不重要!