2015-12-11 2 views
2

Я хотел бы вычислить хэш ресурса (например, PDF) из URL-адреса. С этой целью я написалNode.js: вывести запрос запроса в crypto.hash

const computeHash = co.wrap(function* main(url) { 
    const response = yield promisify(request)(url); 
    // assume response.status === 200 
    const buf = new Uint8Array(response.arrayBuffer); 
    const hash = crypto.createHash('sha1'); 
    hash.update(buf, 'binary'); 
    return hash.digest('hex'); 
}); 

использоваться

const hash = yield computeHash('http://arxiv.org/pdf/1001.1234v3.pdf'); 

Что мне нравится код:

  • Это генератор, так что я могу yield это. Всего в шаге от async/await.

Что мне не нравится:

  • Это не правильно вычислить хэш. :)
  • Завершается request и тело ответа в целом подключено к функции hash. Я предпочел бы передать вывод request в функцию хэша.

Любые подсказки?

+0

Откуда вы знаете, что он неправильно вычисляет хэш? С чем вы сравниваете? – mscdex

+1

Вычисляется локально 'sha1sum'. И он всегда вычисляет один и тот же хеш, независимо от URL. –

ответ

2

crypto.createHash() обеспечивает Hash экземпляр, который в настоящее время поддерживает два интерфейса: наследие (update() и digest()) и потокового видео. Вам не нужно делать ничего особенного, чтобы использовать как один, так, чтобы поток в ответ на хеширования поток, это так просто, как:

var hasher = crypto.createHash('sha1'); 
hasher.setEncoding('hex'); 
request(url).pipe(hasher).on('finish', function() { 
    console.log('Hash is', hasher.read()); 
}); 

Вот как вы могли бы сделать это с нормальной функции обратного вызова, но я не являюсь конечно, как вы будете работать yield, поскольку я недостаточно знаком с генераторами и тому подобным.