2013-09-06 6 views
29

crypto नोड.जेएस के मॉड्यूल (कम से कम इस लेखन के समय) अभी भी स्थिर नहीं माना जाता है और इसलिए एपीआई बदल सकता है। (: जोर मेरा टिप्पणी):क्रिप्टो मॉड्यूल की स्ट्रीम क्षमताओं का उपयोग करके फ़ाइल के हैश प्राप्त करना (यानी: हैश.अपडेट और हैशडिजिस्ट के बिना)

वास्तव में, तरीकों कि इंटरनेट उपयोग में हर कोई एक फ़ाइल का हैश (MD5, SHA1, ...) प्राप्त करने के लिए (Hash class के प्रलेखन से) विरासत माना जाता है कक्षा: हैश

डेटा की हैश डाइजेस्ट बनाने के लिए कक्षा।

यह एक धारा है जो पठनीय और लिखने योग्य दोनों है। लिखा गया है हैश की गणना करने के लिए प्रयोग किया जाता है। एक बार स्ट्रीम के लिखने योग्य पक्ष समाप्त हो जाने के बाद, गणना की हैश पाचन प्राप्त करने के लिए पढ़ने() विधि का उपयोग करें। विरासत अद्यतन और पाचन विधियों भी समर्थित हैं।

crypto.createHash द्वारा लौटाया गया।

hash.update और hash.digest बावजूद विरासत, उदाहरण के सिर्फ उद्धृत टुकड़ा ऊपर दिखाए गए विचार किया जा रहा है उन्हें इस्तेमाल कर रहा है।

उन विरासत विधियों का उपयोग किए बिना हैश प्राप्त करने का सही तरीका क्या है?

उत्तर

61

प्रश्न में उद्धृत टुकड़ा से:

[हैश वर्ग] यह एक धारा है कि दोनों पठनीय और लिखने योग्य है। लिखा गया है हैश की गणना करने के लिए प्रयोग किया जाता है। एक बार स्ट्रीम के लिखने योग्य पक्ष समाप्त हो जाने के बाद, गणना की हैश पाचन प्राप्त करने के लिए पढ़ने() विधि का उपयोग करें।

तो क्या आप कुछ पाठ हैश करने के लिए की जरूरत है:

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); 
+0

यह हैश वस्तु से डेटा सामग्री प्राप्त करने के लिए संभव है? – sunnycmf

+0

@sunnycmf आपका क्या मतलब है? यदि आपका मतलब है कि मूल डेटा जो आप चाहते हैं तो मुझे ऐसा नहीं लगता है। यदि आपका मतलब गणना हैश है, तो बस 'हैश.read() 'का उपयोग करें। –

+0

हाँ मेरा मतलब मूल डेटा है, coz एक बार फ़ाइल को पढ़ना और डेटा और sha1 हैश प्राप्त करना चाहते हैं। – sunnycmf

9
कार्लोस 'जवाब के

लघु संस्करण:

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 
    }) 
7

हैश डाइजेस्ट के लिए एक वादा लौटने एक ES6 संस्करण:

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'))); 
    }); 
} 
+1

मुझे यह पसंद है। यहां संभावित सुधार: https://gist.github.com/F1LT3R/2e4347a6609c3d0105afce68cd101561 – f1lt3r

2

इसके अलावा पॉलिश, 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()) 
     }) 
) 
} 
संबंधित मुद्दे

 संबंधित मुद्दे