Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

245
Vistas
¿Por qué mis datos binarios aleatorios generados en JavaScript son altamente comprimibles?

Mi objetivo es generar datos incompresibles en Javascript como /dev/urandom

Usé el siguiente comando de mi Mac y obtuve 31,5 Mb de datos que no se pueden comprimir con ZIP o RAR.

 dd if=/dev/urandom of=file.txt bs=1048576 count=30

Pero cuando trato de producir datos incompresibles en Javascript como /dev/urandom

Es muy fácil de comprimir en WinRAR. WinRAR comprimido a menos de 1Mb. En Zip se comprime a 30Mb

Aquí está mi código

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>How to generate Incompressible data in Javascript like /dev/urandom</title> </head> <body> <script> var ulDataSize = 30; //Mb var mData = new Float64Array(131072); var n = mData.length; for (var i = 0; i < n; i++) { mData[i] = Math.random()*9; } var uploadData = []; for (var i = 0; i < ulDataSize; i++) uploadData.push(mData); uploadData = new Blob(uploadData, { type: "application/octet-stream" }); function download(text, name, type) { var a = document.getElementById("a"); //var file = new Blob([text], {type: type}); a.href = URL.createObjectURL(uploadData); a.download = name; } </script> <a href="" id="a">click here to Download Incompressible data</a> <button onclick="download('file text', 'Incompressibledata.txt', 'text/plain')"> Generate Data</button> </body> </html>
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Aparte del hecho de que está repitiendo los mismos datos 30 veces (lo que es inherentemente no aleatorio), no creo que Math.random() * 9 produzca valores en toda la gama de patrones de bits que un elemento en un Float64Array puede mantenga (aunque mi conocimiento de coma flotante binaria no es suficiente para respaldar esa duda con datos), lo que significa que se repetirán más patrones de bits, reduciendo la aleatoriedad.

Para estar seguro, probablemente usaría un Uint8Array con valores en el rango completo de 0 a 255, desde entonces estoy seguro de que estoy usando todos los patrones de bits; algo como esto:

 function download(name) { const blocks = Array.from( {length: 30}, () => Uint8Array.from( {length: 1024 * 1024}, () => Math.floor(Math.random() * 256) ) ); const blob = new Blob(blocks, {type: "application/octet-stream"}); const a = document.getElementById("a"); a.href = URL.createObjectURL(blob); a.download = name; }

Tenga en cuenta que he eliminado el name no utilizado y los parámetros de type .

Cuando uso eso, gzip (la herramienta que tengo a mano) no reduce el tamaño del archivo resultante (pasa de 31,457,280 bytes a 31,462,121 bytes).

Son muchas llamadas a Math.random() , pero básicamente tenemos la garantía de que exploraremos completamente los patrones de bits disponibles. Es posible que pueda reducir la cantidad de llamadas mediante el uso de Uint16Array o Uint32Array . Por ejemplo:

 const blockSize = (1024 * 1024) / 4; const blocks = Array.from( {length: 30}, () => Uint32Array.from( {length: blockSize}, () => Math.random() * 4294967296 ) );

Para mí, gzip todavía no pudo hacer nada con él (el mismo resultado que el anterior), pero tomó un poco más de una cuarta parte del tiempo para generar.

Usar un Float64Array no funcionó (para mí), aparentemente Math.random no explora la gama completa de patrones de bits posibles en un número de punto flotante binario IEEE-754 de 64 bits y/o el formato tiene rangos (probablemente pequeños) sin usar . Entonces, las entradas de 32 bits pueden ser el mejor compromiso.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda