2010-06-06 2 views
15

Я использую это:Как заполнить массив байтов барахлом?

byte[] buffer = new byte[10240]; 

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

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

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

+6

ли данные нежелательной должны быть случайным ? Или просто каждый раз? –

+0

Пожалуйста, не дублируйте теги ("C#") в названии. Кроме того, не используйте «csharp» в качестве тега. Тот факт, что он используется только в четырех вопросах, должен быть ключом к вам, чтобы не использовать его. –

ответ

10

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

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) 

Update

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

RandomBufferGenerator generator = new RandomBufferGenerator(MaxBufferSize); 

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

Я понимаю, что для использования этого кода я должен сделать: RandomBufferGenerator bufferGenerator = new RandomBufferGenerator (1024); byte [] buffer = bufferGenerator.GenerateBufferFromSeed (1024); Но нужно ли каждый раз создавать экземпляр RandomBufferGenerator? Не могли бы вы привести мне пример того, как его использовать? Благодарю. – flyout

+0

Да, создайте RandomBufferGenerator один раз, а затем используйте этот экземпляр для генерации ваших буферов. Я обновил ответ с помощью некоторого примера использования. –

+5

Никогда, никогда не используйте этот код: 'new Random (DateTime.Now.Millisecond)' - когда вы просто используете 'new Random', он автоматически переводит значение в текущий тик (100 наносекунд) из' Environment.TickCount'. В вашем коде все «случайные», созданные в том же миллисекунде, будут иметь одинаковое семя, поэтому производят одинаковые числа, и за это время могут быть созданы тысячи тысяч. Это не очень хорошая практика. –

33

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

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

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

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

1

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

+0

Да, я имею в виду случайные данные, NextBytes выглядит хорошо, я проведу его через какое-то время, спасибо всем за ответы. – flyout

3

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

+0

Или откройте случайное изображение/файл/исполняемый файл и просто используйте это как случайные данные. – CodingBarfield

+1

Я почти уверен, что это то, о чем действительно спрашивал ОП. По существу, объявление char * в небезопасном коде указывает на неинициализированный кусок памяти, заполненный тем, что было в прошлом. –

Смежные вопросы