Как заполнить байтовый массив мусором? - PullRequest
19 голосов
/ 06 июня 2010

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

byte[] buffer = new byte[10240];

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

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

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

Ответы [ 5 ]

39 голосов
/ 06 июня 2010

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

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

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

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

13 голосов
/ 06 июня 2010

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

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);
...
3 голосов
/ 06 июня 2010

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

3 голосов
/ 06 июня 2010

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

1 голос
/ 06 июня 2010

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

...