You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js流处理:生成文件哈希时输出混入原始文本的修复方法

如何修复Node.js中写入哈希值时同时包含源文件内容的问题?

你遇到的问题根源很明确:你同时用了两种方式往输出流里写内容——readData.pipe(writeData)会把源文件的所有内容直接复制到输出文件,而你又在end事件里把计算好的哈希值写入同一个输出流,所以最终结果就是源文本+哈希值的组合。

问题代码分析

看你这段代码:

const fs = require('fs');
const crypto = require('crypto');
const hash = crypto.createHash('MD5');
const readData = fs.createReadStream('./task1/input.txt');
const writeData = fs.createWriteStream('./task1/output.txt');
readData.on('data', (chunk) => {
  hash.update(chunk);
});
readData.on('end', () => {
  const resultHash = hash.digest('hex');
  writeData.end(resultHash);
  console.log(resultHash);
});
readData.pipe(writeData); // 这行就是问题所在!

pipe()方法的作用是把可读流的所有数据直接导向可写流,相当于自动帮你把源文件的每一个chunk都写到输出文件里,和你手动计算哈希的逻辑完全独立,所以两者的内容都被写入了。

修复方案

只需要移除readData.pipe(writeData)这一行即可,这样输出流就只会在end事件里写入计算好的哈希值:

const fs = require('fs');
const crypto = require('crypto');
const hash = crypto.createHash('MD5');
const readData = fs.createReadStream('./task1/input.txt');
const writeData = fs.createWriteStream('./task1/output.txt');

readData.on('data', (chunk) => {
  hash.update(chunk);
});

readData.on('end', () => {
  const resultHash = hash.digest('hex');
  writeData.end(resultHash);
  console.log(resultHash);
});

这样修改后,输出文件里就只会有MD5哈希值,不会再包含源文件的内容了。

内容的提问来源于stack exchange,提问作者Martin White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:43