3

node.jsの別のプロセスで発生する可能性のある別の状態で使用するためにcrypto.createHash('sha1')(で満たされた後)の現在の状態を保存する方法は?hash.update(buffer)http request

私はこのようなことを想像します:

var crypto = require('crypto'),
    hash   = someDatabase.read('hashstate')    // continue with filled hash
             || crypto.createHash('sha1');     // start a new hash

// update the hash
someObj.on('data', function(buffer){
    hash.update(buffer);
});
someObj.on('end', function(){
    // store the current state of hash to retrieve it later (this won't work:)
    someDatabase.write('hashstate', hash);

    if(theEndOfAllRequests){
        // create the result of multiple http requests
        hash.digest('hex');
    }
});
4

3 に答える 3

3

いくつかの選択肢がありますが、さまざまなトレードオフがあります。注意すべき重要なことはcrypto、ハッシュ関数の部分的な状態を公開しないため、状態をデータベースに保存する計画を直接実装する方法がないことです。

オプション 1 では、ハッシュ関数に飛び込む必要がありますが、これは難しい場合があります。幸いなことに、すでに javascript で書かれたものがあります。繰り返しますが、状態は公開されませんが、コード変換が非常に難しいとは思いません。create- h0-4blockoffsetshift、およびtotalLength. 次に、計画どおりに状態をデータベースに保存できます。

オプション 2 にはcrypto、プロセス間でハッシュされるデータの使用と受け渡しが含まれます。これは作業がはるかに簡単だと思いますが、速度も大幅に低下します。いくつかの簡単なテストでは、メッセージは約 2.5 ~ 3MB/秒の速度で通過するように見えるため、各 3MB チャンクには約 1.5 秒かかります (文字列しか渡すことができないため、Base64 変換が必要になると予想されます)。これには 33% の追加料金がかかります)。これを行うにはprocess.send、識別 ID とともにデータを送信するために使用します。マスター プロセスはworker.on各ワーカーで を使用してメッセージを取得し、ハッシュ オブジェクトへの ID のマッピングを保持します。最後に、最後のメッセージを受信して​​いることをマスターに伝えるフラグをメッセージに含める必要があります。これはworker.send、結果のハッシュ (ワーカーで で受信process.on) になります。

これらの音のどれが最も適しているかについて、喜んで詳しく説明します。

于 2014-01-10T07:44:47.743 に答える
1

hash.updateデータが入ってきたら、複数回呼び出すことができます。

チャンクを取得する方法を知らずに何をすべきかを正確に言うのは難しいですが、v1 ストリームを使用した簡単な例を次に示します。

var hash = crypto.createHash('sha1');
var data = // incoming file data

data.on('data', function(chunk){
  hash.update(chunk);
});
data.on('end', function(){
  var sha = hash.digest('hex');

  // Do something with it
})
于 2013-05-26T03:24:08.137 に答える