Java ThreadLocalRandom.current().nextLong()的最大长度

Java ThreadLocalRandom.current().nextLong()的最大长度,java,multithreading,random,Java,Multithreading,Random,我计划使用ThreadLocalRandom.current.nextLong跨多个线程生成ID。应用程序的标准是具有19位数字值。我们以前使用System.nanoTime进行填充,但最近它生成了相同的ID 我尝试使用ThreadLocalRandom.current.nextLong,它生成了19位长的值。它的值总是19位还是可以小于19位?在多个线程之间使用是否安全?的文档仅说明:返回伪随机长值。nextLonglong绑定的文档说明:返回一个介于零(包含)和指定绑定(独占)之间的伪随机长

我计划使用ThreadLocalRandom.current.nextLong跨多个线程生成ID。应用程序的标准是具有19位数字值。我们以前使用System.nanoTime进行填充,但最近它生成了相同的ID

我尝试使用ThreadLocalRandom.current.nextLong,它生成了19位长的值。它的值总是19位还是可以小于19位?在多个线程之间使用是否安全?

的文档仅说明:返回伪随机长值。nextLonglong绑定的文档说明:返回一个介于零(包含)和指定绑定(独占)之间的伪随机长值。因此,绑定可以高达9223372036854775807,这是一个19位数字

然而,ThreadLocalRandom的文档没有说明其状态大小或保证的周期长度,也没有提到该方法内部使用的算法。因此,它可能没有生成ID所需的质量


相反,考虑使用一个加密RNG,例如JavaSaleTy.SoCurrand,用于ID生成。但首先,考虑一下为什么需要生成ID。ID必须是唯一的吗?他们一定很难猜到吗?你能用序列号来代替吗?您应该回答我给出的六个问题,这样您就可以找到在应用程序中生成唯一ID的最佳方法。

您可以简单地指定所需的范围吗?例如,如果您只希望随机ID的长度为12位,请使用以下命令:

ThreadLocalRandom.current().nextLong(100000000000L, 899999999999L)
此外,根据java文档,与多线程一起使用应该是安全的:

当有多个线程时,使用ThreadLocalRandom尤其合适 例如,每个任务都有一个java.util.concurrent.ForkJoinTask JDK 1.7在线程池中并行使用随机数


nextLong的javadoc怎么说?