我如何在 Deno 中获取文件校验和?
How can I get a file checksum in Deno?
刚开始使用 Deno,我想弄清楚如何计算二进制文件校验和。在我看来,问题不在于标准库的哈希模块提供的方法,而在于文件流方法 and/or 提供 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
on Windows 10 这个可以用:
CertUtil -hashfile ./my_big_folder.tar.gz md5
文件 API 不用于在 Deno 中读取文件,为此您需要使用 Deno.open API 然后将其转换为像这样的可迭代对象
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);
刚开始使用 Deno,我想弄清楚如何计算二进制文件校验和。在我看来,问题不在于标准库的哈希模块提供的方法,而在于文件流方法 and/or 提供 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
on Windows 10 这个可以用:
CertUtil -hashfile ./my_big_folder.tar.gz md5
文件 API 不用于在 Deno 中读取文件,为此您需要使用 Deno.open API 然后将其转换为像这样的可迭代对象
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);