【发布时间】:2020-01-14 05:43:57
【问题描述】:
今天,我在 .NET Core 中做一些测试,遇到了一些有趣的事情。
在(~.NET Framework 4)之前,Random 使用 Environment.TickCount,但现在我相信这已经改变了。
考虑以下代码:
while (true)
{
Random random = new Random();
Console.WriteLine(random.Next(0, 10000));
}
在较早的 .NET Framework 版本中,new Random() 空构造函数将使用 Environment.TickCount,这会导致伪随机值的重复。
所以你可以期待这样的结果:
542
4211
5244
5244
5244
9501
9501
以此类推,以此类推。
在使用最新编译器的最新 .NET Core 版本上,我收到了以下结果:
5332
220
3928
524
2973
2840
4965
5667
657
6434
3170
3046
7044
这肯定有所改进。
在旧版本中展示此行为的其他 S.O 问题:
How do I generate a random int number?
generate random numbers with no repeat in c#
Is C# Random Number Generator thread safe?
我的设置:.NET Core 2.2 / 最新的 C# 编译器。
实际问题
所以我的问题是,PRNG 是否真的得到了改进,或者他们只是更改了构造函数以使用另一个默认种子,如果是,他们使用什么作为种子?现在密码学是否更安全(如果他们真的改变了实现)?
【问题讨论】:
-
Is it safer now for cryptography?否。如docs:“要生成加密安全随机数,例如适合创建随机密码的随机数,请使用 RNGCryptoServiceProvider 类或从 System. Security.Cryptography.RandomNumberGenerator" -
问题是你一次又一次地重新创建一个新的
Random。您应该只创建一次。 -
@HimBromBeere 我知道,这正是我要说的。在旧版本上,它会多次重复该数字,但在新版本上则不会。
-
@dyukha 我也这么想,但如果它的内部结构发生了变化(我不确定),那么他们可能做了一些额外的事情。不确定。
-
@AxelKemper 我相信参考资源已经过时了。它使用默认构造函数作为 TickCount,如果我直接使用 Environment.TickCount,我将得到旧的和重复的结果。