我希望在JRE中找到熵源(噪声源)。 (熵源是指PRNG(伪随机数发生器)的种子材料(或种子)。)
但是,我并不确切知道种子的熵来源是什么。
所以我很难在JRE中找到合适的熵源。
你能告诉我这个吗?
答案 0 :(得分:1)
您可以从JVM中的不同来源提取熵:
最明显的来源是时钟
System.currentTimeMillis();
System.nanoTime();
您可以请求可用内存,该内存经常更改
Runtime.getRuntime().freeMemory()
您还可以将对象的内部hashCode用作熵
System.identityHashCode(someObject)
new Object[0].hashCode()
想要更重的东西,也许最全面的熵源是map,它们具有许多特性,这些特性会随时间变化而无法预测。
ManagementFactory.getMemoryMXBean()
ManagementFactory.getThreadMXBean()
...
最后,例如,您始终可以生成MXBeans和Random数字或SecureRandom
new Random().nextLong()
new SecureRandom().nextLong()
UUID.randomUUid()
顺便说一句,有人问了同样的问题random UUIDs,但没有更多的成功。
答案 1 :(得分:0)
想象一下JVM是一个沙盒。
当您不被允许离开沙箱时,您的选择非常有限。然后你可以做一些简单的事情,例如要求用户在键盘上进行随机输入,或者你建立一个面板并让他用鼠标画一些东西。
但是,如果您的用例允许进行系统调用,您可以根据您运行的操作系统的细节查看更高级的选项。
答案 2 :(得分:0)
如果您对底层操作系统或其他JVM源外部不感兴趣,您可能应该使用SecureRandom。
以下是Oracle的官方回答:
快速随机数,专为真正随机性的基本任务而设计 不是主要目标。这对于像色彩的颜色很有用 使用,防止力导向布局重叠,或哪些图片 在评估人口统计信息后从列表中显示。
高并发程序如果有价值,也可以使用ThreadLocalRandom 速度超过真正的随机性。这与上面相同但很可能 如果同时线程生成伪随机,则提供更好的性能 数字在同一时间。
较慢但更随机的SecureRandom 专为无法预测数字的重要任务而设计的 成功至关重要。例子包括赌博,科学等案例 抽样或任何加密操作。虽然慢了 其他两个随机数生成器,其在许多中具有更好的随机性 应用
完整帖子:https://blogs.oracle.com/java-platform-group/thats-so-securerandom