我有以下测试程序,我尝试使用电话号码加上当前时间来播种随机数。看起来以下是产生重复。有什么想法吗?
计数= 100000 大小= 683
$session = (new Jonasva\GoogleTrends\GoogleSession($config))->authenticate();
答案 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
的内部工作,而不是种子生成......