java - ThreadLocalRandom.current().nextLong() 的最大长度
问题描述
我打算使用 ThreadLocalRandom.current().nextLong() 跨各个线程生成 ID。应用程序的标准是具有 19 位数字值。我们之前使用 System.nanoTime() 进行填充,但最近它生成了相同的 ID。
我尝试使用 ThreadLocalRandom.current().nextLong() 并生成 19 位长值。它的值总是 19 位还是也可以小于 19 位?在多个线程之间使用是否安全?
解决方案
的文档nextLong()
只说:“返回一个伪随机long
值”。文档nextLong(long bound)
说:“返回long
零(包括)和指定边界(不包括)之间的伪随机值。” 因此,bound
可以高达 9223372036854775807,这是一个 19 位数字。
但是,文档ThreadLocalRandom
没有说明其状态大小或保证的周期长度,也没有提及该方法在内部使用的算法。因此,它可能不具备生成 ID 所需的质量。
相反,请考虑使用加密 RNG,例如java.security.SecureRandom
用于 ID 生成。但首先,考虑一下为什么需要生成 ID。ID 必须是唯一的吗?他们必须很难猜吗?您可以只使用序列号吗?您应该回答我在“唯一随机标识符”中给出的六个问题,以便了解如何最好地在您的应用程序中生成唯一 ID。
推荐阅读
- phoenix-framework - Gettext 在暂存环境中不起作用?(凤凰(长生不老药),debian)
- c++ - 表示为一维的多维数组(模板化为 n 维)
- java - 从JAVA中的方法将字符返回到数组
- python - 如何替换 pandas.Series 中的词干句子?
- python - 将嵌套列表写入 json
- c# - 创建 TransactionScope 并创建上下文顺序
- java - 使用注解的构造函数注入
- angularjs - 无法在 Angular JS 中使用 Http Get 请求获取数据
- jscolor - JSColor Picker 是“低于”FancyBox / FeatherLight 灯箱
- java - Why does intellij print "void" when using evaluate log for a breakpoint?