Получение хэша файла с использованием возможностей потока криптового модуля (то есть: без hash.update и hash.digest)
Модуль crypto
node.js(на момент написания не менее) не считается стабильным, поэтому API может измениться. Фактически, методы, используемые всеми в Интернете для получения хэша (md5, sha1,...) файла, считаются устаревшими (из документации Hash
class) (примечание: основное внимание):
Класс: Хэш
Класс для создания хеш-дайджестов данных.
Это поток, который доступен как для чтения, так и для записи. Письменные данные используется для вычисления хэша. Как только перезаписываемая сторона потока закончите, используйте метод read(), чтобы получить вычисленный хеш-дайджест. устаревшее обновление и методы дайджест.
Возвращается crypto.createHash.
Несмотря на то, что hash.update
и hash.digest
считаются устаревшими, пример, показанный выше цитированного фрагмента, использует их.
Каков правильный способ получения хэшей без использования этих унаследованных методов?
Ответы
Ответ 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())
})
)
}