46

node.jsのcryptoモジュール (少なくともこの記事の執筆時点) はまだ安定しているとは見なされないため、API が変更される可能性があります。実際、インターネットの誰もがファイルのハッシュ (md5、sha1、...) を取得するために使用するメソッドは、( Hashclassのドキュメントから) レガシーと見なされます (注: 私の強調):

クラス: ハッシュ

データのハッシュ ダイジェストを作成するためのクラス。

これは、読み取りと書き込みの両方が可能なストリームです。書き込まれたデータは、ハッシュの計算に使用されます。ストリームの書き込み可能な側が終了したら、read() メソッドを使用して、計算されたハッシュ ダイジェストを取得します。従来の 更新方法とダイジェスト方法もサポートされています。

crypto.createHash によって返されます。

レガシーと見なされているにhash.updateもかかわらず、引用されたスニペットのすぐ上に示されている例はそれらを使用しています。hash.digest

これらの従来の方法を使用せずにハッシュを取得する正しい方法は何ですか?

4

6 に答える 6

90

質問で引用されたスニペットから:

【ハッシュクラス】読み書き可能なストリームです。書き込まれたデータは、ハッシュの計算に使用されます。ストリームの書き込み可能な側が終了したら、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);
于 2013-09-06T13:06:59.917 に答える
15

さらなる磨き、ECMAScript 2015

hash.js:

'use strict';

function checksumFile(algorithm, path) {
  return new Promise(function (resolve, reject) {
    let fs = require('fs');
    let crypto = require('crypto');

    let hash = crypto.createHash(algorithm).setEncoding('hex');
    fs.createReadStream(path)
      .once('error', reject)
      .pipe(hash)
      .once('finish', function () {
        resolve(hash.read());
      });
  });
}

checksumFile('sha1', process.argv[2]).then(function (hash) {
  console.log('hash:', hash);
});
node hash.js hash.js
hash: 9c92ec7acf75f943aac66ca17427a4f038b059da

少なくとも v10.x から動作します:

node --version
v10.24.1
于 2017-12-23T09:23:39.627 に答える