Как я могу получить контрольную сумму файла в Deno?

Только начиная с 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

Этот код компилируется и работает без ошибок, жаль, что результат отличается от того, что я получаю при запуске функций крипто-модуля, предоставляемого узлом, и md5sum, предоставляемого linux coreutils. Любое предложение ?

код 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

2 ответа

File 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);
      import { crypto, toHashString } from 'https://deno.land/std@0.176.0/crypto/mod.ts';

const getFileBuffer = (filePath: string) => {
    const file = Deno.openSync(filePath);
    const buf = new Uint8Array(file.statSync().size);
    file.readSync(buf);
    file.close();
    return buf;
};

const getMd5OfBuffer = (data: BufferSource) => toHashString(crypto.subtle.digestSync('MD5', data));

export const getFileMd5 = (filePath: string) => getMd5OfBuffer(getFileBuffer(filePath));
Другие вопросы по тегам