Генерация случайного двоичного файла - PullRequest
20 голосов
/ 23 сентября 2009

Почему генерация файла размером 1 КБ в моей системе (ноутбуке младшего класса) с небольшой нагрузкой заняла 5 минут? И как я мог генерировать случайный двоичный файл быстрее?

$ time dd if=/dev/random of=random-file bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 303.266 s, 0.0 kB/s

real    5m3.282s
user    0m0.000s
sys 0m0.004s
$ 

Обратите внимание, что dd if=/dev/random of=random-file bs=1024 count=1 не работает. Он генерирует случайный двоичный файл произвольной длины, в большинстве случаев под 50 B. Есть кто-нибудь объяснение этому тоже?

Ответы [ 5 ]

28 голосов
/ 23 сентября 2009

Это связано с тем, что в большинстве систем /dev/random использует случайные данные из среды, например статические данные с периферийных устройств. Пул действительно случайных данных (энтропии), которые он использует, очень ограничен. Пока больше данных не доступно, выходные блоки.

Повторите тест с /dev/urandom (обратите внимание на u), и вы увидите значительное ускорение.

См. Википедия для получения дополнительной информации. /dev/random не всегда выводит действительно случайные данные, но, очевидно, в вашей системе это делает.

Пример с /dev/urandom:

$ time dd if=/dev/urandom of=/dev/null bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 0.00675739 s, 152 kB/s

real    0m0.011s
user    0m0.000s
sys 0m0.012s
12 голосов
/ 23 сентября 2009

Попробуйте /dev/urandom вместо:

$ time dd if=/dev/urandom of=random-file bs=1 count=1024

От: http://stupefydeveloper.blogspot.com/2007/12/random-vs-urandom.html

Основное различие между случайным и случайным - это то, как они вытягивают случайные данные из ядра. Случайный всегда берет данные из пула энтропии. Если пул пуст, функция random блокирует операцию до тех пор, пока пул не будет заполнен достаточно. urandom будет генерировать данные с использованием алгоритма SHA (или любого другого алгоритма, иногда MD5) в случае, если пул энтропии ядра пуст. urandom никогда не заблокирует операцию.

3 голосов
/ 04 сентября 2011

Я написал скрипт для проверки скорости различных функций хеширования. Для этого мне нужны были файлы «случайных» данных, и я не хотел использовать один и тот же файл дважды, чтобы ни одна из функций не имела преимущества в кэше ядра по сравнению с другой. Я обнаружил, что и / dev / random, и / dev / urandom были мучительно медленными. Я решил использовать dd для копирования данных с моего жесткого диска, начиная со случайных смещений. Я НИКОГДА не рекомендую использовать это, если вы делаете что-то, связанное с безопасностью, но если все, что вам нужно, это шум, то не имеет значения, где вы его получите. На Mac используйте что-то вроде / dev / disk0, в Linux используйте / dev / sda

Вот полный тестовый скрипт:

tests=3
kilobytes=102400
commands=(md5 shasum)
count=0
test_num=0
time_file=/tmp/time.out
file_base=/tmp/rand

while [[ test_num -lt tests ]]; do
    ((test_num++))
    for cmd in "${commands[@]}"; do
        ((count++))
        file=$file_base$count
        touch $file
        # slowest
        #/usr/bin/time dd if=/dev/random of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file
        # slow
        #/usr/bin/time dd if=/dev/urandom of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file                                                                                                        
        # less slow
        /usr/bin/time sudo dd if=/dev/disk0 skip=$(($RANDOM*4096)) of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file
        echo "dd took $(tail -n1 $time_file | awk '{print $1}') seconds"
        echo -n "$(printf "%7s" $cmd)ing $file: "
        /usr/bin/time $cmd $file >/dev/null
        rm $file
    done
done

Вот "менее медленные" результаты / dev / disk0:

dd took 6.49 seconds
    md5ing /tmp/rand1:         0.45 real         0.29 user         0.15 sys
dd took 7.42 seconds
 shasuming /tmp/rand2:         0.93 real         0.48 user         0.10 sys
dd took 6.82 seconds
    md5ing /tmp/rand3:         0.45 real         0.29 user         0.15 sys
dd took 7.05 seconds
 shasuming /tmp/rand4:         0.93 real         0.48 user         0.10 sys
dd took 6.53 seconds
    md5ing /tmp/rand5:         0.45 real         0.29 user         0.15 sys
dd took 7.70 seconds
 shasuming /tmp/rand6:         0.92 real         0.49 user         0.10 sys

Вот "медленные" / dev / urandom результаты:

dd took 12.80 seconds
    md5ing /tmp/rand1:         0.45 real         0.29 user         0.15 sys
dd took 13.00 seconds
 shasuming /tmp/rand2:         0.58 real         0.48 user         0.09 sys
dd took 12.86 seconds
    md5ing /tmp/rand3:         0.45 real         0.29 user         0.15 sys
dd took 13.18 seconds
 shasuming /tmp/rand4:         0.59 real         0.48 user         0.10 sys
dd took 12.87 seconds
    md5ing /tmp/rand5:         0.45 real         0.29 user         0.15 sys
dd took 13.47 seconds
 shasuming /tmp/rand6:         0.58 real         0.48 user         0.09 sys

Вот самые "медленные" / dev / random результаты:

dd took 13.07 seconds
    md5ing /tmp/rand1:         0.47 real         0.29 user         0.15 sys
dd took 13.03 seconds
 shasuming /tmp/rand2:         0.70 real         0.49 user         0.10 sys
dd took 13.12 seconds
    md5ing /tmp/rand3:         0.47 real         0.29 user         0.15 sys
dd took 13.19 seconds
 shasuming /tmp/rand4:         0.59 real         0.48 user         0.10 sys
dd took 12.96 seconds
    md5ing /tmp/rand5:         0.45 real         0.29 user         0.15 sys
dd took 12.84 seconds
 shasuming /tmp/rand6:         0.59 real         0.48 user         0.09 sys

Вы заметите, что / dev / random и / dev / urandom не сильно отличались по скорости. Однако / dev / disk0 занял половину времени.

PS. Я уменьшил количество тестов и удалил все, кроме 2 команд, ради «краткости» (не то, чтобы мне удалось быть кратким).

2 голосов
/ 29 мая 2013

Старая тема, но, как упоминал Тоббе, мне нужно что-то подобное, только лучше (быстрее).

Итак ... способ оболочки сделать то же самое, просто быстрее, чем случайный / случайный, полезен при создании действительно больших файлов, я признаю, что не полностью случайный, но достаточно близкий, вероятно, зависит от ваших потребностей.

dd if=/dev/mem of=test1G.bin bs=1M count=1024
touch test100G.bin
seq 1 100 | xargs -Inone cat test1G.bin >> test100G.bin

Это создаст файл 100 Гб из содержимого вашего оперативной памяти (первые 1ГБ, я полагаю, у вас так много оперативной памяти :)) Обратите внимание, что, возможно, также небезопасно предоставлять доступ к этому файлу, поскольку он может содержать все виды конфиденциальных данных, таких как ваши пароли, поэтому используйте его только для собственных целей :) О, и вам нужно запустить его как root по той же причине. 1006 *

0 голосов
/ 14 мая 2013

Старая тема, но мне просто нужно то же самое. Старый друг С пришел на помощь, так как я не хочу возиться со сценариями. Вот мое решение, которое достаточно быстро и хорошо для меня:

// usage: ./program <outfile> <size-in-bytes>
#include <stdio.h>
void main(int argc, char** argv){
    long long i, s;
    FILE* f = fopen(*(argv+1), "w");
    srand(time(NULL));
    sscanf(*(argv+2), "%lld", &s);  
    for(i=0;i<s;i++){
        fputc(rand()%255,f);
    }
    fclose(f);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...