当前位置: 首页 > 编程语言 > C#

在C#中使用真正的随机数生成器最快的实现分享

时间:2023-04-10 17:49:35 C#

C#学习教程:在C#中使用真随机数生成器的最快实现》MSDN推荐使用RNGCryptoServiceProvider类什么速度图?有没有最快的方法来获得真正的随机数?编辑:使用Random.Next()我得到一个新的随机数。使用...byte[]randomNumber=newbyte[1];RNGCryptoServiceProviderGen=newRNGCryptoServiceProvider();Gen.GetBytes(randomNumber);intrand=Convert.ToInt32(randomNumber[0]);我得到一个“加密安全随机数”我想知道上面的代码是否比“Random.Next()”更快,如果有一些快速的方法可以得到相同的结果,请问?回答这个问题最简单的方法可能是把它倒过来。假设CryptoServiceProvider实现具有所有优点。它与Random.Next一样快,使用的内存也一样少。那么为什么这两种实现都存在呢?为什么我们甚至在框架中有Random.Next?查看我们对每个实施的了解。一个生成加密安全随机数,另一个不做任何承诺。哪个更简单?生成足够随机以用于加密的随机数,或者生成只是“看起来”随机但不保证其他任何内容的数字?如果生成加密安全随机数没有相关成本,那么每个随机数生成器都会这样做。您通常可以假设一个标准库函数被设计成开箱即用并能很好地完成它所说的事情。Random.Next旨在尽可能高效地为您提供伪随机数序列中的下一个随机数。CryptoServiceProvider旨在生成足够强大的随机数以用于密码学,并尽可能高效地执行此操作。如果有一种方法可以像Random.Next一样高效地执行此操作,那么Random.Next也会使用它。你的问题似乎是假设框架设计者的脑损伤-他们以某种方式设计了一个不必要的慢函数来生成密码安全的随机数,即使有更快的方法。生成加密安全随机数的最快方法很可能是调用专家设计的函数来生成加密安全随机数。关于安全和加密的经验法则:永远不要自己编写。以标准方式进行,避免危险的优化。编辑以解决更新的问题:当您需要安全敏感代码中未使用的统计随机数和安全敏感代码中的RNGCryptoServiceProvider时,请使用Random.Next。它不如Random.Next快,但具有可接受的性能。您应该进行基准测试以查看实际差异。为了安全而牺牲性能通常是没有意义的。您的示例代码生成的“加密安全随机数”只会在0到255(含)之间!如果你想返回所有可能的Int32值,你应该使用4个随机字节。您的代码应如下所示:RNGCryptoServiceProviderrng=newRNGCryptoServiceProvider();byte[]rndBytes=newbyte[4];rng.GetBytes(rndBytes);intrand=BitConverter.ToInt32(rndBytes,0);)机器显示Random.Next比使用RNGCryptoServiceProvider快大约200倍。您首先应该做的是了解RNG、PRNG和CSPRNG之间的基本区别。只有在那之后,你才应该决定你真正需要什么,以及如何实现它。但是,作为一般规则,您应该接受已建立并被证明是正确实施的内容。在硬件中获得真正随机数的唯一已知方法是缓慢的;如果你试图走得更快,你的头发会变白并掉成一团,NRC会派机器人来清理服务器机房。我和Mehrdad在这个问题上:不要尝试自己动手。一个附带问题,但有趣的是您在问题中使用“真实”。硬件或软件中不存在真正的随机数。它们像放射性衰变或电线上的噪音一样“存在于现实生活中”,但无法通过程序生成。所以请注意jalf使用“伪”并检查jcinacio的维基百科链接。据我所知,永远不会有真正的随机生成器在C#中实现。这只能在硬件的帮助下完成吗?还有一点尚未明确:给定相同的初始种子值,PRNG将产生可预测的结果。CSPRNG没有——它没有种子值。这使得PRNG(在某种程度上)适用于密码流算法。给定相同初始化向量(用作一个或多个PRNG的种子值)的两台计算机可以使用明文字节的异或结果和所用种子PNG的输出私密且高效地相互通信。我并不是说这样的实现当然必须是加密安全的;只有这样的实现才需要PRNG的可预测性,而CSPRNG无法提供。以上就是C#学习教程:在C#中使用真正的随机数生成器实现所有分享内容的最快实现。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处: