Linux 生成随机二进制文件
为什么在我的(低端笔记本电脑)系统上用很少的负载生成一个1kib的文件需要5分钟?如何更快地生成随机二进制文件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 $ 请
$ 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用户身份运行它。很难选择一个可接受的答案,因为这两个答案都是正确的,并且在同一分钟内发布。我选择了一个答案最正确投票,我希望我能选择两者。