您可以迭代地遍历目录,统计目录及其包含的每个文件,而不是跟踪链接并生成哈希。这是一个例子:
'use strict';
// npm install siphash
var siphash = require('siphash');
// npm install walk
var walk = require('walk');
var key = siphash.string16_to_key('0123456789ABCDEF');
var walker = walk.walk('/tmp', {followLinks: false});
walker.on('directories', directoryHandler);
walker.on('file', fileHandler);
walker.on('errors', errorsHandler); // plural
walker.on('end', endHandler);
var directories = {};
var directoryHashes = [];
function addRootDirectory(name, stats) {
directories[name] = directories[name] || {
fileStats: []
};
if(stats.file) directories[name].fileStats.push(stats.file);
else if(stats.dir) directories[name].dirStats = stats.dir;
}
function directoryHandler(root, dirStatsArray, next) {
addRootDirectory(root, {dir:dirStatsArray});
next();
}
function fileHandler(root, fileStat, next) {
addRootDirectory(root, {file:fileStat});
next();
}
function errorsHandler(root, nodeStatsArray, next) {
nodeStatsArray.forEach(function (n) {
console.error('[ERROR] ' + n.name);
console.error(n.error.message || (n.error.code + ': ' + n.error.path));
});
next();
}
function endHandler() {
Object.keys(directories).forEach(function (dir) {
var hash = siphash.hash_hex(key, JSON.stringify(dir));
directoryHashes.push({
dir: dir,
hash: hash
});
});
console.log(directoryHashes);
}
您当然希望将其转换为某种命令行应用程序,以便可能接受参数并仔细检查文件是否每次都以正确的顺序返回(可能在散列之前根据文件名对文件统计信息进行排序!) 以便 siphash 每次都返回正确的哈希值。
这不是经过测试的代码.. 只是为了提供一个我可能会从这类事情开始的示例。
编辑:为了减少依赖关系,如果你想要require('crypto');,你可以使用 Node 的加密库而不是 siphash,当然如果你愿意,你可以自己遍历/统计目录和文件。