Javascript 文件的同步哈希函数
我有一个函数,它为给定的路径生成校验和Javascript 文件的同步哈希函数,javascript,node.js,Javascript,Node.js,我有一个函数,它为给定的路径生成校验和 function getHash(path) { var fs = require('fs'); var crypto = require('crypto'); var fd = fs.createReadStream(path); var hash = crypto.createHash('sha1'); hash.setEncoding('hex'); fd.on('end', funct
function getHash(path) {
var fs = require('fs');
var crypto = require('crypto');
var fd = fs.createReadStream(path);
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');
fd.on('end', function () {
hash.end();
// *** Here is my problem ***
console.log(hash.read());
});
fd.pipe(hash);
};
我想调用calcnewahsh
函数,以便它返回散列,问题是,我还没有找到此函数的异步版本,也许有人可以提供帮助
只需添加一个return
语句就行了,因为该函数位于侦听器中
稍后我想将校验和添加到一个对象中,这样我就可以将其作为参数引用,但这仍然不会改变这是一个同步的…您基本上有两种解决方案: #1与承诺一起工作(即q-npm安装q-保存) #2或使用回调函数 如果回调函数中没有深度嵌套,我会选择选项2
(注意:幕后承诺也在使用回调,如果你有深度嵌套,这只是一个“更干净”的解决方案)我知道这很旧,但在搜索这些内容时,它位于顶部结果中。因此,对于那些在这里寻找解决方案的人,你可以这样做:(注意,只有当你知道文件很小时,这才有效。否则,对于较大的文件,请参考Dieterg提供的答案)
非常感谢,我尝试了第二种选择!我没有经常使用回调函数,但现在我想我已经使用了:)因为我试图生成数组的多个散列,并使用循环的变量作为索引,我遇到了一些问题,但我通过将索引作为参数来修复它
function getHash(path) {
var Q = require('q');
var fs = require('fs');
var crypto = require('crypto');
var deferred = Q.defer();
var fd = fs.createReadStream(path);
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');
fd.on('end', function () {
hash.end();
// *** Here is my problem ***
console.log(hash.read());
deferred.resolve(hash.read());
});
fd.pipe(hash);
return deferred.promise;
};
getHash('c:\\')
.then(function(result) {
// do something with the hash result
});
function getHash(path, cb) {
var fs = require('fs');
var crypto = require('crypto');
var fd = fs.createReadStream(path);
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');
fd.on('end', function () {
hash.end();
// *** Here is my problem ***
console.log(hash.read());
if (cb) {
cb(null, hash.read());
}
});
fd.pipe(hash);
};
getHash('C:\\', function (error, data) {
if (!error) {
// do something with data
}
});
const fs = require('fs');
const crypto = require('crypto');
function fileHashSync(filePath){
var fileData;
try{ fileData = fs.readFileSync(filePath, 'utf8'); }
catch(err){
if(err.code === 'ENOENT') return console.error('File does not exist. Error: ', err);
return console.error('Error: ', err);
}
return crypto.createHash('sha1').update(fileData, 'utf8').digest('hex');
}