我正在阅读 Random.Next()对于“适合创建随 secret 码的加密安全随机数”,MSDN 建议 RNGCryptoServiceProvider Class
什么是速度惩罚?有一些最快的方法来获得真正的随机数吗?
编辑: 使用 Random.Next() 我得到一个新的随机数。还有……
byte[] randomNumber = new byte[1];
RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
Gen.GetBytes(randomNumber);
int rand = Convert.ToInt32(randomNumber[0]);
我得到一个“加密安全随机数” 我想知道上面的代码与 "Random.Next()" 相比是否更快,如果有一些快速的方法可以得到相同的结果,好吗?
最佳答案
回答问题的最简单方法可能是将问题颠倒过来。
假设 CryptoServiceProvider 实现拥有所有优势。它与 Random.Next 一样快,占用的内存也一样少。
那为什么这两种实现都存在? 为什么我们在框架中有 Random.Next?
看看我们对每个实现的了解。一个生成加密安全随机数,另一个不做任何 promise 。
哪个更简单?生成足够随机以用于密码学的随机数,或者生成只是“看起来”随机但不能保证其他任何内容的数字? 如果生成加密安全随机数没有相关成本,那么每个随机数生成器都会这样做。
您通常可以假设标准库函数旨在按照包装盒上的说明进行操作,并且可以很好地完成。 Random.Next 旨在让您尽可能高效地获取伪随机数序列中的下一个随机数。
CryptoServiceProvider 旨在生成足够强大的随机数以用于密码学,并尽可能高效地执行此操作。如果有一种方法可以像 Random.Next 一样高效地执行此操作,那么 Random.Next 也会使用它。
您的问题似乎假设框架设计者脑部受损 - 他们以某种方式设计了一个不必要的缓慢函数来生成加密安全随机数,即使有更快的方法。
生成加密安全随机数的最快方法最有可能调用专家设计的函数来生成加密安全随机数。
关于c# - C# 中真随机数生成器的最快实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668361/