我用长数字播种了我的安全随机对象.现在我想提取另一个长数字.但是只有一个叫做nextBytes(byte[] b)随机的函数byte[].
有没有办法得到一个长号?
SecureRandom ranGen1 = new SecureRandom();
ranGen1.setSeed(1000);
SecureRandom ranGen2 = new SecureRandom();
ranGen2.setSeed(1000);
byte[] b1= new byte[3];
byte[] b2=new byte[3];
ranGen1.nextBytes(b1);
ranGen2.nextBytes(b2);
int a1=b1[0];
int a2=b1[1];
int a3=b1[2];
int c1=b2[0];
int c2=b2[1];
int c3=b2[2];
System.out.println(a1+", "+a2+", "+a3);//genearated by ranGen1
System.out.println(c1+", "+c2+", "+c3);//generated by ranGen2
System.out.println(ranGen1.nextLong());//genearated by ranGen1
Run Code Online (Sandbox Code Playgroud)
System.out.println(ranGen2.nextLong()); //由ranGen2生成
结果:
4, -67, 69
4, -67, 69
-3292989024239613972 //this is using nextLong()
-3292989024239613972
Run Code Online (Sandbox Code Playgroud)
Peter Lawrey的代码输出:(使用安全随机)
-7580880967916090810 -7580880967916090810
7364820596437092015 7364820596437092015
6152225453014145174 6152225453014145174
6933818190189005053 6933818190189005053
-2602185131584800869 -2602185131584800869
-4964993377763884762 -4964993377763884762
-3544990590938409243 -3544990590938409243
8725474288412822874 8725474288412822874
-8206089057857703584 -8206089057857703584
-7903450126640733697 -7903450126640733697
Run Code Online (Sandbox Code Playgroud)
它们也是相同的.你怎么能得到不同的数字?
这是我在使用Peter Lawrey的第二次更新后获得的输出(我正在使用Windows操作系统,他似乎正在使用其他一些操作系统造成混乱)
SHA1PRNG appears to produce the same values with the same seed
The default PRNG on this system is SHA1PRNG
Run Code Online (Sandbox Code Playgroud)
再次修改,这是正确的答案!(我应该遵循自己的建议并更仔细地阅读文档)
是该你使用的是什么?如果是这样,它会扩展Random,因此它具有继承的nextLong()方法.当它覆盖next()时,所有典型的Random方法都将使用SecureRandom PRNG方法.
(在评论中看到为什么我的第二个答案是不正确的......或者说是不必要的)
我建议通过从接下来的8个字节或两个整数(由下一个返回)中编写它来创建一个long.这样做没有问题,我看不出为什么你不能触及所有长值的任何原因(认为两个32位半部分中的任何一个都可以具有从0到2 ^ 32的值,具有相同的值概率)或为什么一个比另一个更可能(这意味着它不是伪随机的).
我不完全理解为什么随机文档表明nextLong()的限制,但我相信它是它使用的线性算法的限制(我认为线性算法有一个更短的周期 - 即当它们开始重复数字时 - 比现代PRNGs).我认为值得探讨加密堆栈交换的好奇心.
| 归档时间: |
|
| 查看次数: |
14276 次 |
| 最近记录: |