【问题标题】:Does RNGCryptoServiceProvider.GetBytes write a sequential stream of bits to the byte[] resultRNGCryptoServiceProvider.GetBytes 是否将位的顺序流写入 byte[] 结果
【发布时间】:2014-07-20 21:10:19
【问题描述】:

我一直在试图弄清楚 RNGCryptoServiceProvider.GetBytes 的实现来回答标题问题。

换句话说,GetBytes 方法是否会生成一个比特流/数组,然后将它们顺序写入字节数组,这样我就可以通过按顺序循环字节并查看每个字节的位数?

我检查了此处找到的源:rngcryptoserviceprovider.cs,但它显然调用了out to the CLR,我不知道如何获取它的源。

    [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode), SuppressUnmanagedCodeSecurity]
    [ResourceExposure(ResourceScope.None)]
    private static extern void GetBytes(SafeProvHandle hProv, byte[] randomBytes, int count);

【问题讨论】:

  • 出于兴趣,为什么对你很重要?
  • 你想达到什么目的?
  • 我不明白这个问题。 “重新创建”是什么意思?这里不涉及任何流。
  • 没错,文档讨论了一系列(字节)值。
  • 如果字节是随机且均匀分布的,那么每一位也应该是随机且均匀分布的。它们是如何生成的重要吗?

标签: c# random


【解决方案1】:

阅读 cmets 了解更多信息后,我认为我知道你在问什么......

所以实际上,您应该使用 RNGCryptoServiceProvider 的 GetNonZeroBytes(byte[] data) 方法。这将阻止您连续接收 8 个零位,这会影响您的统计方法。然后,正如 blorgbeard-is-out 所指出的,“字节是随机且均匀分布的,每个比特也应该是随机且均匀分布的。”

另外,RNGCryptoServiceProvider 使用起来可能有点棘手,所以我提供了一个简短的示例,以及如何将字节数组转换为位:

/* A static member inside a class somewhere. Only instantiate this once per execution of your application. */
static RNGCryptoServiceProvider _rng = new RNGCryptoServiceProvider();

/* Inside a method */
byte[] rngBytes4 = new byte[4];
 _rng.GetNonZeroBytes(rngBytes4); // This populates the byte array

BitArray randomBits = new BitArray(rngBytes4);
foreach(bool bit in randomBits)
{
    // Do something with bit here
}

// And, because its not obvious how to get BitArray to return you a list: 
List<bool> randomBitsAsList = randomBits.Cast<bool>().ToList();

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2018-09-26
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多