Parece que si hago un hash de un flujo de archivos, obtengo un hash diferente que si escribo el flujo en el disco, lo leo y luego lo hago. ¿Posiblemente un problema de codificación o me equivoco de que los hashes DEBERÍAN ser los mismos?
Aquí está mi caso de prueba
const fs = require("fs"); const crypto = require("crypto"); const https = require("https"); (async ()=>{ const testUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/SIPI_Jelly_Beans_4.1.07.tiff/lossy-page1-256px-SIPI_Jelly_Beans_4.1.07.tiff.jpg" const filePath = "./testFile.jpg"; https.get(testUrl, async function(response) { await writeFile(filePath, response); const streamHash = await hashFileStream(response) const fileHash = await hashLocalFile(filePath) console.log("Stream Hash", streamHash); console.log("File hash", fileHash); }); })() async function writeFile(filePath, stream) { return new Promise((resolve, reject) => { const file = fs.createWriteStream(filePath); stream.pipe(file) .on('finish', () => { resolve(filePath); }) .on('error', (error)=>{ console.error(error); reject(error); }) }) } async function hashFileStream(stream){ return new Promise((resolve, reject)=>{ const hash = crypto.createHash('md5').setEncoding('hex'); stream.pipe(hash) .on('finish', ()=>{ resolve(hash.read()) }) .on('error', (error)=>{ reject(error) }) }) } async function hashLocalFile(filepath){ const readStream = fs.createReadStream(filepath); return hashFileStream(readStream); }Ese es tu error. De acuerdo con los documentos del nodo js:
El evento 'finalizar' se emite después de que se haya llamado al método stream.end() y todos los datos se hayan vaciado al sistema subyacente.
Cuando finaliza el evento emitido en la función writeFile , la transmisión termina de escribir datos y no queda nada para la función hashFileStream .
Si solo desea verificar las cadenas hash, la forma más fácil es separar el código y verá que son iguales:
const fs = require("fs"); const crypto = require("crypto"); const https = require("https"); (async ()=>{ const filePath = "./testFile.jpg"; const testUrl = "https://static2.farakav.com/files/pictures/watermark/01661368.jpg" https.get(testUrl, async function(response) { await writeFile(filePath, response); const fileHash = await hashLocalFile(filePath) console.log("File hash", fileHash); }); https.get(testUrl, async function(response) { const streamHash = await hashFileStream(response) console.log("Stream Hash", streamHash); }); })() async function writeFile(filePath, stream) { return new Promise((resolve, reject) => { const file = fs.createWriteStream(filePath); stream.pipe(file) .on('finish', () => { resolve(filePath); }) .on('error', (error)=>{ console.error(error); reject(error); }) }) } async function hashFileStream(stream){ return new Promise((resolve, reject)=>{ const hash = crypto.createHash('md5').setEncoding('hex'); stream.pipe(hash) .on('finish', ()=>{ hash.end(); resolve(hash.read()) }) .on('error', (error)=>{ reject(error) }) }) } async function hashLocalFile(filepath){ const readStream = fs.createReadStream(filepath); return hashFileStream(readStream); }