随机码种子制作重复

时间:2016-03-16 16:29:18

标签: java

我有以下测试程序,我尝试使用电话号码加上当前时间来播种随机数。看起来以下是产生重复。有什么想法吗?

计数= 100000 大小= 683

$session = (new Jonasva\GoogleTrends\GoogleSession($config))->authenticate();

2 个答案:

答案 0 :(得分:1)

嗯,这是重复的,因为你正在使用System.currentTimeMillis(),这意味着在1毫秒内,这个值不会改变,你的种子也是如此。并且你在一毫秒内多次经历你的循环

我认为没有办法在纳秒内获得时间。您应该等待至少一毫秒(如果您的应用程序可以)

答案 1 :(得分:0)

您生成的不同种子的数量与生成所有种子所花费的毫秒数直接相关。使用System.currentTimeMillis()测量循环所需的时间,然后打印它,我总是time = size-1

解决方案:改为使用System.nanoTime()

执行此更改后,您将始终拥有size=1000。这是因为%1000L,它将任何给定电话号码的可能输出数量最大化为1000。如果可以,请将其删除。

编辑:来自https://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html

  

public void setSeed(long seed)

     

使用给定长种子中包含的八个字节重新种植此随机对象。给定的种子补充而不是替代现有的种子。因此,保证重复呼叫永远不会减少随机性。

虽然OP可能没有必要做什么,但它不应该是安全风险,因为setSeed不会将SecureRandom对象重置为可预测状态。

另外,反复生成相同的种子并不是一个问题,因为同样的事实:最后,安全性依赖于SecureRandom的内部工作,而不是种子生成......