tutorial traduccion programas programacion ejemplos comando bourne again linux bash

linux - traduccion - Generando un archivo binario aleatorio



ejemplos de programas en bash (5)

Escribí un script para probar varias funciones de hashing. Para esto quería archivos de datos "aleatorios", y no quería usar el mismo archivo dos veces para que ninguna de las funciones tuviera una ventaja de caché de kernel sobre la otra. Encontré que tanto / dev / random como / dev / urandom eran dolorosamente lentos. Elegí usar dd para copiar los datos de mi disco duro a partir de compensaciones aleatorias. NUNCA sugeriría usar esto si está haciendo algo relacionado con la seguridad, pero si todo lo que necesita es ruido, no importa dónde lo obtenga. En una Mac use algo como / dev / disk0 en Linux use / dev / sda

Aquí está el script de prueba completo:

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

Aquí están los resultados / dev / disk0 "menos lentos":

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

Aquí están los resultados "lentos" / 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

Aquí están los resultados "más lentos" / dev / aleatorios:

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

Notarás que / dev / random y / dev / urandom no fueron muy diferentes en velocidad. Sin embargo, / dev / disk0 tomó 1/2 del tiempo.

PD. Disminuyo el número de pruebas y eliminé todas las órdenes menos 2 por "brevedad" (no es que logré ser breve).

¿Por qué demoró 5 minutos generar un archivo de 1 KiB en mi sistema (computadora portátil de gama baja) con poca carga? ¿Y cómo podría generar un archivo binario aleatorio más rápido?

$ 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 $

Tenga en cuenta que dd if=/dev/random of=random-file bs=1024 count=1 no funciona. Genera un archivo binario aleatorio de longitud aleatoria, en la mayoría de las ejecuciones por debajo de 50 B. ¿Alguien tiene una explicación para esto también?


Esto se debe a que en la mayoría de los sistemas /dev/random utiliza datos aleatorios del entorno, como la estática de dispositivos periféricos. El conjunto de datos verdaderamente aleatorios (entropía) que utiliza es muy limitado. Hasta que haya más datos disponibles, saldrán los bloques.

Vuelva a intentar su prueba con /dev/urandom (observe la u ) y verá una aceleración significativa.

Ver Wikipedia para más información. /dev/random no siempre genera datos verdaderamente aleatorios, pero claramente en su sistema lo hace.

Ejemplo con /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


Hilo viejo pero solo necesitaba lo mismo. El viejo amigo C vino a rescatar, ya que no quiero meterme con los scripts. Aquí está mi solución, que es lo suficientemente buena y rápida para mí:

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


Hilo viejo, pero como mencionó Tobbe, necesitaba algo así solo mejor (más rápido).

Así que ... una forma sencilla de hacerlo de la misma manera, simplemente más rápido que aleatorio / aleatorio, útil cuando se crean archivos realmente grandes, lo admito no completamente aleatorio, pero probablemente lo suficientemente cerca, depende de sus necesidades.

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

Esto creará un archivo de 100 Gb a partir del contenido de su ram (el primer 1 GB, asumo que tiene tanto ram :)) Tenga en cuenta que probablemente no sea seguro compartir este archivo, ya que puede contener todo tipo de datos confidenciales como sus contraseñas. así que úselo solo para sus propias causas :) Ah, y necesita ejecutarlo como root por la misma razón.


Intente /dev/urandom lugar:

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

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

La principal diferencia entre aleatorio y urandom es cómo extraen datos aleatorios del núcleo. Al azar siempre toma datos de la agrupación de entropía. Si el grupo está vacío, aleatorio bloqueará la operación hasta que el grupo se llene lo suficiente. urandom generará datos usando SHA (o cualquier otro algoritmo, MD5 a veces) algoritmo en el grupo de entropía del kernel de casos está vacío. urandom nunca bloqueará la operación.