生成随机二进制文件

时间:2009-09-22 22:10:00

标签: linux bash

为什么在我的(低端笔记本电脑)系统上生成1 KiB文件需要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 个答案:

答案 0 :(得分:27)

这是因为在大多数系统上/dev/random使用来自环境的随机数据,例如来自外围设备的静态数据。它使用的真正随机数据(熵)池非常有限。在有更多数据可用之前,输出块。

使用/dev/urandom重试您的测试(请注意u),您会看到显着的加速。

有关详细信息,请参阅Wikipedia/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

答案 1 :(得分:12)

请尝试/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之间的主要区别在于它们如何从内核中提取随机数据。随机总是从熵池中获取数据。如果池为空,则随机将阻止操作,直到池充满。在内核熵池为空的情况下,urandom将使用SHA(或任何其他算法,有时是MD5)算法来生成数据。 urandom永远不会阻止操作。

答案 2 :(得分:3)

我写了一个脚本来测试各种哈希函数的速度。为此,我想要“随机”数据的文件,我不想两次使用相同的文件,因此没有一个函数具有内核缓存优势。我发现/ 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占用了1/2的时间。

PS。为了“简洁”,我减少了测试次数并删除了除2个命令之外的所有命令(并不是说我成功了)。

答案 3 :(得分:2)

旧线程,但像Tobbe提到的那样,我需要这样的东西才更好(更快)。

所以...这样做的shell方式相同,比随机/随机更快,在创建非常大的文件时非常有用,我承认不是完全随机的,但可能足够接近,取决于你的需求。

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

这将从你的ram的内容创建一个100Gb文件(第一个1GB,我假设你有这么多ram :)) 请注意,共享此文件也可能不安全,因为它可能包含各种敏感数据,例如您的密码,因此仅将其用于您自己的原因:)哦,您需要以root身份运行它,原因相同。< / p>

答案 4 :(得分:0)

旧线程,但我只需要相同的东西。老朋友C来救援,因为我不想乱用脚本。这是我的解决方案,对我来说很好,也很快:

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