使用NextBytes时为空字节数组

时间:2016-10-05 09:04:56

标签: c# random .net-core

考虑我有以下代码:

public sealed class SimpleRandomProvider : IRandomProvider
{
    private static readonly Lazy<Random> RandomHolder = new Lazy<Random>(() => new Random());

    public void NextBytes(byte[] buffer)
    {
        RandomHolder.Value.NextBytes(buffer);
    }
}

不幸的是,每当我在NextBytes System.Random中呼叫buffer时,都会填充空字节:

Screen cast

奇怪的是,X的{​​{1}}(约100)次调用工作正常。

发生了什么事? 可能是.Net Core中的错误

调用生成的代码:

NextBytes

用于生成低于指定do { randomProvider.NextBytes(bytes); bytes[bytes.Length - 1] &= 0x7F; result = new BigInteger(bytes); } while (result >= maxExclusive || result.Equals(BigInteger.One) || result.Equals(BigInteger.Zero)); 的{​​{1}}。 在开始生成填充零的缓冲区之前(在单元测试运行期间),将片段避免称为100-200次。

修改

您可以下载我的项目:https://github.com/pwasiewicz/big-prime-number - 然后运行测试 - 它应该失败,因为只有当缓冲区为空时才会抛出InvalidOperationException。

逐个运行测试时。但是运行它们(在VS中全部运行)会导致异常。

1 个答案:

答案 0 :(得分:2)

事实证明,对NextBytes的多线程访问存在问题:

private static readonly Lazy<Random> RandomHolder = new Lazy<Random>(() => new Random());
private static readonly object Access = new object();

public void NextBytes(byte[] buffer)
{
    lock (Acces)
        RandomHolder.Value.NextBytes(buffer);
}