Как заполнить массив байтов барахлом?

Я использую это:

byte[] buffer = new byte[10240];

Как я понимаю, это инициализирует буферный массив из 10kb, заполненный 0s.

Каков самый быстрый способ заполнить этот массив (или инициализировать его) мусорными данными каждый раз?

Мне нужно использовать этот массив, напримеp > 5000 раз, и каждый раз заполнять его разными файлами мусора, поэтому я ищу быстрый способ сделать это. Размер массива также должен будет меняться каждый раз.

Ответы

Ответ 1

Если вы довольны тем, что данные являются случайными, но создаются из случайного семенного буфера, вы можете сделать следующее:

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;
    }
}

Я обнаружил, что это примерно в 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) 

Обновление

Общая идея состоит в том, чтобы создать RandomBufferGenerator один раз, а затем использовать этот экземпляр для генерации случайных буферов, например:

RandomBufferGenerator generator = new RandomBufferGenerator(MaxBufferSize);

byte[] randomBuffer1 = generator.GenerateBufferFromSeed(10 * 1024);
byte[] randomBuffer2 = generator.GenerateBufferFromSeed(5 * 1024);
...

Ответ 2

Ответ на "самый быстрый способ" невозможно без описания свойств ваших нежелательных данных. Почему не все нулевые действительные данные мусора?

Тем не менее, это быстрый способ заполнить ваш массив бессмысленными номерами.

Random r = new Random();
r.NextBytes(buffer);

Вы также можете взглянуть на реализацию собственного линейного конгруэнтного генератора, если Random недостаточно для вас. Они просты в реализации и быстро, но не дают высококачественных случайных чисел. (Мне непонятно, нужны ли вам эти или нет.)

Ответ 4

В качестве еще одного варианта рассмотрения Marshall.AllocHGlobal будет выделяться неуправляемая память. Он не обнуляет память, вы получаете то, что оказалось там, так что это очень быстро. Конечно, теперь вам нужно работать с этой памятью с помощью небезопасного кода, и если вам нужно потянуть его в управляемое пространство, вам лучше с Random.NextBytes.

Ответ 5

Насколько неудобны должны быть данные? Вы имеете в виду случайное? Если это так, просто используйте класс Random.