c# - C# 中真随机数生成器的最快实现

标签 c# performance random

我正在阅读 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/

相关文章:

c# - 如何使用存储库模式伪造 Entity Framework 中的 DbContext.Entry 方法

c# - Resharper 多重属性生成

c++ - std::vector::emplace_back 比 std::vector::push_back 慢的示例?

performance - Matlab - 是否存在一种更快的方法来为大矩阵赋值?

SQL Server 2005 - 多处理器使用

ios - 生成随机数但未分配 UIButton

c# - 在 asp.net mvc 站点上收集统计信息?

c# - 可移植类库中的 System.Tuple 在哪里?

java - 生成一个结果没有点的除法,除数和被除数是从一系列数字中随机生成的

linux - 在 Bash 中按照特定模式生成随机字符串的最佳方法