我编写了以下代码来创建文件的哈希:
function hashFile(filePath){
try{
// Setup hash
var hash = crypto.createHash('sha256');
hash.setEncoding('hex');
// Setup filestream
var fileStream = fs.createReadStream(filePath);
fileStream.pipe(hash, { end: false });
fileStream.on('end', function () {
// Get the hash
hash.end();
var thisHash = String(hash.read());
});
}catch (err) {
console.log( "Error thrown : " + err );
return;
}
}
这个工作得很好,直到我扔了一些较小的文件。当我这样做时,该功能就会挂起。 filestream.on('end')
回调永远不会发生。
我把它重写为不使用createReadStream:
function hashFile(filePath){
try{
fs.readFile(filePath, function (err, data) {
// Make the hash
var thisHash = crypto
.createHash('sha256')
.update(data, 'utf8')
.digest( 'hex');
console.log(thisHash);
});
}catch (err) {
console.log( "Error: " + err );
return;
}
}
这段代码运行得很好,除了它在几MB或更大的文件上速度非常慢。
我的问题是为什么第一个函数不能处理小文件?
答案 0 :(得分:0)
所以在整个晚上寻找答案后,我在写完这篇文章后15分钟就知道了。 '结束'在调用管道之前需要配置回调:
var fileStream = fs.createReadStream(filePath);
var hash = crypto.createHash('sha256');
hash.setEncoding('hex');
fileStream.on('end', function () {
hash.end();
console.log(hash.read());
});
fileStream.pipe(hash);