如何用垃圾填充字节数组?

fly*_*out 20 c# arrays bytebuffer bytearray

我用这个:

byte[] buffer = new byte[10240];
Run Code Online (Sandbox Code Playgroud)

据我所知,这初始化填充0s的10kb缓冲区数组.

什么是每次用垃圾数据填充这个数组(或初始化它)的最快方法?

我需要使用那个数组> 5000次并每次用不同的垃圾数据填充它,这就是为什么我正在寻找一个快速的方法来做到这一点.数组大小也必须每次都改变.

Jor*_*ren 41

如果不描述垃圾数据的属性必须回答"最快的方法"是不可能的.为什么不是所有零都是有效的垃圾数据?

也就是说,这是一种用无意义的数字填充数组的快速方法.

Random r = new Random();
r.NextBytes(buffer);
Run Code Online (Sandbox Code Playgroud)

如果速度不够快,您可能还会考虑实现自己的线性同余生成器Random.它们易于实现且速度快,但不会提供高质量的随机数.(如果你需要或不需要,我不清楚.)


Tim*_*oyd 13

如果您对数据是随机的,但是从随机种子缓冲区创建,那么您可以执行以下操作:

public class RandomBufferGenerator
{
    private readonly Random _random = new Random();
    private readonly byte[] _seedBuffer;

    public RandomBufferGenerator(int maxBufferSize)
    {
        _seedBuffer = new byte[maxBufferSize];

        _random.NextBytes(_seedBuffer);
    }

    public byte[] GenerateBufferFromSeed(int size)
    {
        int randomWindow = _random.Next(0, size);

        byte[] buffer = new byte[size];

        Buffer.BlockCopy(_seedBuffer, randomWindow, buffer, 0, size - randomWindow);
        Buffer.BlockCopy(_seedBuffer, 0, buffer, size - randomWindow, randomWindow);

        return buffer;
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现它比每次从头开始生成随机缓冲区快大约60-70倍.

              START: From seed buffer.
00:00:00.009  END  : From seed buffer. (Items = 5,000; Per Second = 500,776.20)
              START: From scratch.
00:00:00.604  END  : From scratch. (Items = 5,000; Per Second = 8,276.95) 
Run Code Online (Sandbox Code Playgroud)

更新

一般的想法是创建一个RandomBufferGenerator,然后使用此实例生成随机缓冲区,例如:

RandomBufferGenerator generator = new RandomBufferGenerator(MaxBufferSize);

byte[] randomBuffer1 = generator.GenerateBufferFromSeed(10 * 1024);
byte[] randomBuffer2 = generator.GenerateBufferFromSeed(5 * 1024);
...
Run Code Online (Sandbox Code Playgroud)

  • 永远不要使用这个代码:`new Random(DateTime.Now.Millisecond)` - 当你只使用`new Random`时,它会自动将值从"Environment.TickCount"中移植到当前的tick(100纳秒).在你的代码中,在同一个millesecond中实例化的所有`Random`将具有相同的种子,因此产生相同的数字,并且在该时间范围内可以创建数千个.这不是一个好习惯. (5认同)
  • @Callum Rogers:该实例旨在重复使用,因此为此目的,它很好.虽然您有一般的有效点,但此处不适用. (2认同)