Stream 如何在Deno中获取文件校验和?

Stream 如何在Deno中获取文件校验和?,stream,checksum,deno,md5sum,sha1sum,Stream,Checksum,Deno,Md5sum,Sha1sum,从Deno开始,我试图找出如何计算二进制文件校验和。在我看来,问题不在于标准库的hash模块提供的方法,而在于文件流方法和/或提供hash.update方法的块的类型。 我一直在尝试一些与文件打开和块类型相关的替代方法,但没有成功。下面是一个简单的例子: import {createHash} from "https://deno.land/std@0.80.0/hash/mod.ts"; const file= new File(["my_big_folder.

从Deno开始,我试图找出如何计算二进制文件校验和。在我看来,问题不在于标准库的hash模块提供的方法,而在于文件流方法和/或提供hash.update方法的块的类型。 我一直在尝试一些与文件打开和块类型相关的替代方法,但没有成功。下面是一个简单的例子:

import {createHash} from "https://deno.land/std@0.80.0/hash/mod.ts";

const file= new File(["my_big_folder.tar.gz"], "./my_big_folder.tar.gz");
const iterator = file.stream() .getIterator();
const hash = createHash("md5");
for await( let chunk of iterator){
   hash.update(chunk);
}
console.log(hash.toString()); //b35edd0be7acc21cae8490a17c545928
这段代码编译和运行时没有错误,遗憾的是,结果与我运行node提供的crypto模块和linux coreutils提供的md5sum的函数时得到的结果不同。有什么建议吗

nodejs代码:

const crypto = require('crypto');
const fs = require('fs');

const hash = crypto.createHash('md5');

const file = './my_big_folder.tar.gz';
const stream = fs.ReadStream(file);
stream.on('data', data=> { hash.update(data); });
stream.on('end', ()=> {
  console.log(hash.digest('hex')); //c18f5eac67656328f7c4ec5d0ef5b96f
});

bash中的结果相同:

$ md5sum ./my_big_folder.tar.gz
$ c18f5eac67656328f7c4ec5d0ef5b96f ./my_big_folder.tar.gz
在Windows 10上,可以使用此选项:

CertUtil-hashfile./my_big_folder.tar.gz md5

文件API不用于读取Deno中的文件,要做到这一点,您需要使用Deno.open API,然后将其转换为如下所示的iterable

import {createHash} from "https://deno.land/std@0.80.0/hash/mod.ts";

const hash = createHash("md5");

const file = await Deno.open(new URL(
  "./BigFile.tar.gz",
  import.meta.url, //This is needed cause JavaScript paths are relative to main script not current file
));
for await (const chunk of Deno.iter(file)) {
  hash.update(chunk);
}
console.log(hash.toString());

Deno.close(file.rid);