Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 生成随机二进制文件_Linux_Bash - Fatal编程技术网

Linux 生成随机二进制文件

Linux 生成随机二进制文件,linux,bash,Linux,Bash,为什么在我的(低端笔记本电脑)系统上用很少的负载生成一个1kib的文件需要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 $ 请

为什么在我的(低端笔记本电脑)系统上用很少的负载生成一个1kib的文件需要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
$ 

请注意,
ddif=/dev/random of=random file bs=1024 count=1
不起作用。它会生成一个随机长度的随机二进制文件,大多数运行在50 B以下。有人对此也有解释吗?

试试
/dev/uradom

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

random和Uradom的主要区别在于它们如何从内核中提取随机数据。random总是从熵池中获取数据。如果池为空,random将阻止操作,直到池被填满为止。在内核熵池为空的情况下,Uradom将使用SHA(或任何其他算法,有时是MD5)算法生成数据。urandom永远不会阻止操作


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

使用
/dev/uradom
重试测试(注意
u
),您将看到显著的加速

有关更多信息,请参阅
/dev/random
并不总是输出真正的随机数据,但在您的系统上显然是这样的

/dev/uradom
示例:

$ 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

我编写了一个脚本来测试各种哈希函数的速度。为此,我需要包含“随机”数据的文件,我不想两次使用同一个文件,这样就没有一个函数比另一个函数具有内核缓存优势。我发现/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/uradom结果:

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
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结果:

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
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的时间


另外,为了“简洁”,我减少了测试的数量,删除了除2个命令以外的所有命令(并不是说我成功地做到了简洁)。

旧线程,但我只需要同样的东西。老朋友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);
}
//用法:./program
#包括
void main(整型argc,字符**argv){
长我,长我;
文件*f=fopen(*(argv+1),“w”);
srand(时间(空));
sscanf(*(argv+2),%lld,&s);

对于(i=0;i旧线程,但正如前面提到的,我需要这样更好(更快)的东西

所以…一个shell方法也可以这样做,只是比random/Uradom快得多,在创建真正大的文件时很有用,我承认不是完全随机的,但可能足够接近,这取决于您的需要

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用户身份运行它。

很难选择一个可接受的答案,因为这两个答案都是正确的,并且在同一分钟内发布。我选择了一个答案最正确投票,我希望我能选择两者。