【JS 第三方库】spark-md5

2024-02-20 00:00:00

目录:

spark-md5 模块介绍

spark-md5 是轻量级、高性能 MD5 哈希计算库,核心优势在于能够快速计算文件或数据的 MD5 值,特别擅长通过增量计算和分块处理技术来高效处理大文件,有效避免内存溢出问题。

安装依赖:

$ npm install spark-md5

计算字符串 MD5 值

import SparkMD5 from 'spark-md5'

const hash = SparkMD5.hash('Hello World')
console.log(hash) // 输出: b10a8db164e0754105b7a99be72e3fe5

计算文件 MD5 值

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()

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: