目录:
spark-md5 是轻量级、高性能 MD5 哈希计算库,核心优势在于能够快速计算文件或数据的 MD5 值,特别擅长通过增量计算和分块处理技术来高效处理大文件,有效避免内存溢出问题。
安装依赖:
$ npm install spark-md5
import SparkMD5 from 'spark-md5'
const hash = SparkMD5.hash('Hello World')
console.log(hash) // 输出: b10a8db164e0754105b7a99be72e3fe5
import SparkMD5 from 'spark-md5'
import fs from 'fs'
import path from 'path'
/**
* 计算大文件的 MD5 值(分块读取)
* @param {string} filePath - 文件路径
* @param {number} chunkSize - 分块大小(字节),默认 2MB
* @returns {Promise<string>} - MD5 哈希值的 Promise
*/
function calculateLargeFileMD5(filePath, chunkSize = 2 * 1024 * 1024) {
return new Promise((resolve, reject) => {
// 获取文件大小
fs.stat(filePath, (err, stats) => {
if (err) {
reject(err)
return
}
const fileSize = stats.size
const chunks = Math.ceil(fileSize / chunkSize)
const spark = new SparkMD5.ArrayBuffer()
let currentChunk = 0
// 创建读取流
const stream = fs.createReadStream(filePath, {
highWaterMark: chunkSize
})
stream.on('data', (chunk) => {
// 将 Buffer 转换为 ArrayBuffer
const arrayBuffer = chunk.buffer.slice(
chunk.byteOffset,
chunk.byteOffset + chunk.byteLength
);
spark.append(arrayBuffer)
currentChunk++
// 显示进度(可选)
const progress = Math.round((currentChunk / chunks) * 100);
process.stdout.write(`\r计算进度: ${progress}%`)
});
stream.on('end', () => {
process.stdout.write('\n')
const md5 = spark.end()
resolve(md5)
});
stream.on('error', (err) => {
reject(err)
})
})
})
}
// 使用示例
async function main() {
try {
const filePath = './package.json' // 替换为大文件路径
console.log('开始计算大文件 MD5...');
const startTime = Date.now()
const md5 = await calculateLargeFileMD5(filePath)
const endTime = Date.now()
console.log(`文件: ${path.basename(filePath)}`)
console.log(`MD5: ${md5}`)
console.log(`耗时: ${endTime - startTime}ms`)
} catch (error) {
console.error('计算失败:', error.message)
}
}
main()
↶ 返回首页 ↶