首页 > 解决方案 > ThreadLocalRandom.current().nextLong() 的最大长度

问题描述

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

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

标签: javamultithreadingrandom

解决方案


的文档nextLong()只说:“返回一个伪随机long值”。文档nextLong(long bound)说:“返回long零(包括)和指定边界(不包括)之间的伪随机值。” 因此,bound可以高达 9223372036854775807,这是一个 19 位数字。

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

相反,请考虑使用加密 RNG,例如java.security.SecureRandom用于 ID 生成。但首先,考虑一下为什么需要生成 ID。ID 必须是唯一的吗?他们必须很难猜吗?您可以只使用序列号吗?您应该回答我在“唯一随机标识符”中给出的六个问题,以便了解如何最好地在您的应用程序中生成唯一 ID。


推荐阅读