Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

244
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda