根据MSDN文档RandomNumberGenerator:

但是,我在不同的代码库中偶尔看到了以下代码:

byte[] bytes = new byte[...];
RandomNumberGenerator rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
最值得注意的是StackExchange(我假设包括SO)以及BCrypt.Net
因此,我有些困惑-上面的代码返回的是哪种类型的RandomNumberGenerator?某些代码库使用RandomNumberGenerator而不是RNGCryptoServiceProvider是否有点缺陷?
我假设RandomNumberGenerator.Create()在后台执行,而我在这里完全不了解它,但是从技术上讲(因为它是一个抽象类),上面的代码不应该抛出错误吗?

最佳答案

RandomNumberGenerator.Create()方法调用RandomNumberGenerator.Create("System.Security.Cryptography.RandomNumberGenerator"),它将最终创建RNGCryptoServiceProvider的实例。

(它在一对词典中进行一些查找,因此您很可能可以通过在某个地方注册默认随机数生成器来更改该调用的行为。)

返回的对象的实际类型在编译时未知,只知道它将继承RandomNumberGenerator类,因此您可以为其使用RandomNumberGenerator引用变量。

根据输入创建不同类型的实例的这种方式在框架中的几个地方都使用过,例如WebRequest.Create方法。

Micrsoft的某人已“修复”了Create()方法的当前文档(框架4.5)。现在它说:



框架4.0的文档说:



这是该方法的正确描述。我将要求将该描述放回到较新的文档中。

关于c# - RandomNumberGenerator vs RNGCryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12329760/

10-11 00:23