今天,我在.NET Core中进行了一些测试,并且遇到了一些有趣的事情。
以前(〜.NET Framework 4)Random
使用过Environment.TickCount
,但现在我相信情况已经改变。
考虑以下代码:
while (true)
{
Random random = new Random();
Console.WriteLine(random.Next(0, 10000));
}
Run Code Online (Sandbox Code Playgroud)
在较早的.NET Framework版本中,new Random()
空构造函数将使用Environment.TickCount,这将导致伪随机值的重复。
因此,您可以期待如下结果:
542
4211
5244
5244
5244
9501
9501
Run Code Online (Sandbox Code Playgroud)
以此类推。
在使用最新编译器的最新.NET Core版本上,我收到以下结果:
5332
220
3928
524
2973
2840
4965
5667
657
6434
3170
3046
7044
Run Code Online (Sandbox Code Playgroud)
绝对可以改善。
在旧版本中,其他表现出此问题的SO问题:
我的设置:.NET Core 2.2 /最新的C#编译器。
实际问题
所以我的问题是,PRNG是否真的得到了改善,或者他们只是将构造函数更改为使用其他默认种子,如果是,则它们用作种子是什么?密码术现在是否更安全(如果他们实际上改变了实现)?
在最新版本的dotnet core中,Random
默认构造函数从的隐藏私有实例分配其种子Random
。私有实例使用Interop.GetRandomBytes作为其种子。新实例将专用实例的Next()
结果用作其种子。
基本上,这使得在循环中创建多个随机实例“安全”。
在corefx GitHub上阅读更多信息:
相关代码文件:私有随机实例,默认构造函数-生成种子和私有随机实例-生成种子。
种子更改请求请求无参数构造函数的种子改进#1919