我试着用两种不同的方法计算sha256散列,只有一种给出了正确的结果.

import { createHash } from 'node:crypto';
import { Readable } from 'node:stream';

function f1(info: NodeJS.ReadableStream) {
  return new Promise((resolve, reject) => {
    const hash = createHash('sha256');

    info.on('data', (data) => hash.update(data));
    info.on('end', () => resolve(hash.digest('hex')));
    info.on('error', (error) => reject(error));
  });
}

function f2(info: NodeJS.ReadableStream){
  const hasher = createHash('sha256');
  return info.pipe(hasher).digest('hex');
}

export async function test() {
  const h1 = await f1(Readable.from('Testing'));
  const h2 = f2(Readable.from('Testing'));

  console.log(h1);
  console.log(h2);
}

test();

输出:

e806a291cfc3e61f83b98d344ee57e3e8933cccece4fb45e1481f1f560e70eb1
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

只有f1人给出了正确的散列.有没有人知道为什么会这样?

推荐答案

F1和f2是不同的处理数据流.对于f2,您不能将摘要与管道一起使用.我想,管子返回的是可写的蒸汽.试试这个:

function f2(info: NodeJS.ReadableStream) {
  const hasher = createHash('sha256');
  return new Promise((resolve, reject) => {
    info.pipe(hasher)
      .on('finish', () => resolve(hasher.digest('hex')))
      .on('error', (error) => reject(error));
  });
}

Node.js相关问答推荐

Azure虚拟机上的JS Express:可疑请求?

下一个API路由如何处理多个并发请求?

通过 Node js 中的 TBA 执行 netsuite REST upsert 操作出现 401 错误

TS 后端开发:prismagenerate找不到已安装的@tsed/prisma包

dayjs的isSameOrAfter方法未按预期工作

仅在 vue 脚本未退出的情况下使用 docker 时出现错误

登录用户并获取他们的个人资料

将环境变量从 GitHub 操作传递到 json

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

Node.js |如何在微服务之间转发标头?

如何在不使用位置运算符 $ 的情况下更新 mongodb 文档中数组中的嵌套文档?

为什么在调用数据库调用时我的参数没有定义?

为什么需要在 NodeJS 应用程序中创建服务器?

如何在 NodeJS 中获取操作系统用户名?

如何在客户端使用 node.js 模块系统

如何从 npm 注册表中删除 npm 包?

Node.js 连接仅适用于本地主机

npm install - javascript堆内存不足

Npm postinstall 仅用于开发

桌面应用程序仅支持 oauth_callback 值 'oob'/oauth/request_token