Подтвердить что ты не робот

Получение хэша файла с использованием возможностей потока криптового модуля (то есть: без hash.update и hash.digest)

Модуль crypto node.js(на момент написания не менее) не считается стабильным, поэтому API может измениться. Фактически, методы, используемые всеми в Интернете для получения хэша (md5, sha1,...) файла, считаются устаревшими (из документации Hash class) (примечание: основное внимание):

Класс: Хэш

Класс для создания хеш-дайджестов данных.

Это поток, который доступен как для чтения, так и для записи. Письменные данные используется для вычисления хэша. Как только перезаписываемая сторона потока закончите, используйте метод read(), чтобы получить вычисленный хеш-дайджест. устаревшее обновление и методы дайджест.

Возвращается crypto.createHash.

Несмотря на то, что hash.update и hash.digest считаются устаревшими, пример, показанный выше цитированного фрагмента, использует их.

Каков правильный способ получения хэшей без использования этих унаследованных методов?

4b9b3361

Ответ 1

Из цитируемого фрагмента в вопросе:

[класс Hash] Это поток, который является читаемым и записываемым. Письменные данные используется для вычисления хэша. Как только перезаписываемая сторона потока, используйте метод read(), чтобы получить вычисленный хэш файл.

Итак, что вам нужно для хэширования какого-то текста:

var crypto = require('crypto');

// change to 'md5' if you want an MD5 hash
var hash = crypto.createHash('sha1');

// change to 'binary' if you want a binary hash.
hash.setEncoding('hex');

// the text that you want to hash
hash.write('hello world');

// very important! You cannot read from the stream until you have called end()
hash.end();

// and now you get the resulting hash
var sha1sum = hash.read();

Если вы хотите получить хэш файла, лучший способ - создать ReadStream из файла и передать его в хэш:

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

// the file you want to get the hash    
var fd = fs.createReadStream('/some/file/name.txt');
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');

fd.on('end', function() {
    hash.end();
    console.log(hash.read()); // the desired sha1sum
});

// read all file and pipe it (write it) to the hash object
fd.pipe(hash);

Ответ 2

Краткая версия ответа Карлоса:

var fs = require('fs')
var crypto = require('crypto')

fs.createReadStream('/some/file/name.txt').
  pipe(crypto.createHash('sha1').setEncoding('hex')).
  on('finish', function () {
    console.log(this.read()) //the hash
  })

Ответ 3

Версия ES6, возвращающая Promise для хеш-дайджест:

function checksumFile(hashName, path) {
  return new Promise((resolve, reject) => {
    let hash = crypto.createHash(hashName);
    let stream = fs.createReadStream(path);
    stream.on('error', err => reject(err));
    stream.on('data', chunk => hash.update(chunk));
    stream.on('end', () => resolve(hash.digest('hex')));
  });
}

Ответ 4

Дальнейшая полировка, ECMAScript 2015

function checksumFile(algorithm, path) {
  return new Promise((resolve, reject) =>
    fs.createReadStream(path)
      .on('error', reject)
      .pipe(crypto.createHash(algorithm)
        .setEncoding('hex'))
      .once('finish', function () {
        resolve(this.read())
      })
  )
}