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

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

byte[] buffer = new byte[10240];

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

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

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


person flyout    schedule 06.06.2010    source источник
comment
Мусорные данные должны быть случайными? Или каждый раз по-разному?   -  person Dirk Vollmar    schedule 06.06.2010
comment
Пожалуйста, не дублируйте теги (C#) в заголовке. Также не используйте csharp в качестве тега. Тот факт, что он используется только в 4 вопросах, должен быть подсказкой, чтобы вы не использовали его.   -  person John Saunders    schedule 06.06.2010


Ответы (5)


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

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);
...
person Tim Lloyd    schedule 06.06.2010
comment
Я понимаю, что для использования этого кода я должен сделать: RandomBufferGenerator bufferGenerator = new RandomBufferGenerator(1024); byte[] buffer = bufferGenerator.GenerateBufferFromSeed(1024); Но должен ли я каждый раз создавать экземпляр RandomBufferGenerator? Не могли бы вы привести пример того, как его использовать? Спасибо. - person flyout; 06.06.2010
comment
Да, создайте RandomBufferGenerator один раз, а затем используйте этот экземпляр для создания ваших буферов. Я обновил ответ с некоторыми примерами использования. - person Tim Lloyd; 06.06.2010
comment
Никогда, никогда не используйте этот код: new Random(DateTime.Now.Millisecond) — когда вы просто используете new Random, он автоматически устанавливает значение текущего тика (100 наносекунд) из Environment.TickCount. В вашем коде все Random , созданные за одну и ту же миллисекунду, будут иметь одно и то же начальное число, поэтому они будут генерировать одинаковые числа, и за это время могут быть созданы тысячи. Это просто не очень хорошая практика. - person Callum Rogers; 06.06.2010
comment
@Callum Rogers: экземпляр предназначен для повторного использования, поэтому для этой цели он подходит. Хотя у вас есть общая действительная точка зрения, она здесь не применяется. - person Tim Lloyd; 06.06.2010
comment
Спасибо ОЧЕНЬ большое chibacity, ваш код работает НАМНОГО быстрее, чем .NextBytes - person flyout; 07.06.2010

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

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

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

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

person Joren    schedule 06.06.2010

Посмотрите на System.Random.NextBytes() метод

person Joel Coehoorn    schedule 06.06.2010

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

person Matt Greer    schedule 06.06.2010
comment
Или откройте случайное изображение/файл/исполняемый файл и просто используйте его как случайные данные. - person CodingBarfield; 10.01.2012
comment
Я почти уверен, что это то, о чем действительно просил ОП. По сути, объявление char* в небезопасном коде указывает на неинициализированный кусок памяти, заполненный тем, что там было последним. - person Chris Moschini; 14.06.2012

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

person Petar Minchev    schedule 06.06.2010
comment
Да, я имею в виду случайные данные, NextBytes выглядит хорошо, я проверю его через некоторое время, спасибо всем за ответы. - person flyout; 06.06.2010