如何测量PBKDF2 SHA256哈希的计算耗时
关于PBKDF2哈希耗时测量的清晰指南
嘿,我来帮你理清这个时间测量的问题,核心是要区分真实计算耗时和额外开销时间的差异:
首先,明确你需要测量的目标
你要的是单次PBKDF2 SHA256哈希计算本身的耗时,那最准确的方式是记录单个哈希任务从启动到完成的时间差——也就是crypto.pbkdf2函数执行的真实时间,而非其他无关开销时间。
先修正你的现有代码问题
目前你的代码只在回调里记录了结束时间,缺少启动时间的记录,而且参数名有混淆(keylen其实是PBKDF2的迭代次数,第三个参数是迭代次数,第四个才是密钥长度),建议调整为:
function hashPromise(secretPhrase, iterations) { return new Promise(function(resolve, reject) { // 关键:在调用pbkdf2前记录任务启动时间 const startTime = new Date().getTime(); crypto.pbkdf2(secretPhrase, 'salt', iterations, 256, 'sha256', (err, key) => { if (err) { console.log(err); reject(err); } else { const endTime = new Date().getTime(); // 计算单个哈希的真实计算耗时 const computeDuration = endTime - startTime; const hashedKey = key.toString('hex'); console.log(`迭代次数: ${iterations}`); console.log(`哈希计算耗时: ${computeDuration}ms`); console.log(`哈希结果: ${hashedKey}`); resolve({ hashedKey, computeDuration }); } }); }); }
解答你的核心疑问
1. 能不能用日志里两个“TIMESTAMP Hash Finished”的时间差?
绝对不行!因为你用Promise.all并行调用数百次哈希任务,这些任务是同时执行的,日志里的结束时间顺序不代表任务的启动顺序,两个结束时间的差可能是并行任务的重叠时间,完全无法反映单个哈希的计算耗时。
2. 能不能取整个函数的运行总时长?
也不行!整个HTTP触发的函数总时长包含了HTTP请求解析、Promise调度、服务器资源调度、甚至网络延迟等额外开销,尤其是当你并行大量任务时,总时长会受Firebase Functions的CPU/内存限制影响,无法准确体现PBKDF2计算本身的耗时。
3. 你例子里的313ms计算对吗?
只有当1526473894031是同一个哈希任务的结束时间,1526473893718是这个任务的启动时间时,这个差值才是有效的单次计算耗时。如果是两个不同任务的结束时间,这个数字没有任何参考意义。
额外优化建议
- 多次取平均:服务器环境可能有资源波动,建议对同一迭代次数的哈希任务执行多次,取平均耗时,减少误差。
- 控制变量:对比不同迭代次数的耗时,要保证其他变量一致(相同的secretPhrase、盐、密钥长度),这样对比结果才公平。
- 合理控制并发:并行太多任务会导致资源竞争,反而让耗时不准,建议分批次执行,比如每次并行10-20个任务。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

