本文最后更新于 2025-10-30,文章内容可能已经过时。

Java

Java获取文件MD5值有多种方法,推荐使用最简洁的方法:

import org.apache.commons.codec.digest.DigestUtils;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

String md5Hex = DigestUtils.md5Hex(Files.newInputStream(Paths.get("analysis.jar")));
System.out.println("md5Hex = " + md5Hex);

推荐方法:一行代码即可完成,底层实现是分块读取,性能好。

Golang

Golang利用io.TeeReader特性,可以在读取文件的同时计算MD5:

import (
    "crypto/md5"
    "encoding/hex"
    "io"
    "os"
    "path/filepath"
)

func CalculateFileMD5(filePath string) (string, error) {
    file, err := os.Open(filePath)
    if err != nil {
        return "", err
    }
    defer file.Close()
    
    md5Hash := md5.New()
    reader := io.TeeReader(file, md5Hash)
    
    // 读取文件内容(实际使用中可能需要将文件写入新位置)
    buffer := make([]byte, 1024)
    for {
        _, err := reader.Read(buffer)
        if err != nil {
            break
        }
    }
    return hex.EncodeToString(md5Hash.Sum(nil)), nil
}

C++

C++使用OpenSSL库计算文件MD5:

#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <openssl/md5.h>

std::string CalculateMD5(const std::string& file_path) {
    unsigned char digest[MD5_DIGEST_LENGTH];
    MD5_CTX ctx;
    std::ifstream file(file_path, std::ifstream::binary);
    
    if (!file.is_open()) {
        return "";
    }
    
    MD5_Init(&ctx);
    const int bufferSize = 4096;
    unsigned char buffer[bufferSize];
    while (file.read((char*)buffer, bufferSize)) {
        MD5_Update(&ctx, buffer, file.gcount());
    }
    MD5_Update(&ctx, buffer, file.gcount());
    MD5_Final(digest, &ctx);
    
    std::stringstream ss;
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
        ss << std::hex << std::setw(2) << std::setfill('0') << (int)digest[i];
    }
    return ss.str();
}

C

C语言使用OpenSSL库计算文件MD5:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/md5.h>

void calculate_md5(const char* file_path, char* md5_hash) {
    FILE* file = fopen(file_path, "rb");
    if (!file) {
        perror("Error opening file");
        exit(1);
    }
    
    MD5_CTX ctx;
    MD5_Init(&ctx);
    
    const int bufferSize = 4096;
    unsigned char buffer[bufferSize];
    size_t bytesRead;
    
    while ((bytesRead = fread(buffer, 1, bufferSize, file)) > 0) {
        MD5_Update(&ctx, buffer, bytesRead);
    }
    
    MD5_Final(md5_hash, &ctx);
    fclose(file);
}

int main() {
    char md5_hash[33]; // 32 hex characters + null terminator
    calculate_md5("example.txt", md5_hash);
    printf("MD5: %s\n", md5_hash);
    return 0;
}

JavaScript

前端(使用crypto-js库)

// 引入crypto-js库
const CryptoJS = require("crypto-js");

// 计算文件的MD5值
function getFileMD5(file) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = function(e) {
            const fileData = e.target.result;
            const md5 = CryptoJS.MD5(fileData).toString();
            resolve(md5);
        };
        reader.onerror = reject;
        reader.readAsArrayBuffer(file);
    });
}

Node.js后端(使用crypto模块)

const crypto = require('crypto');
const fs = require('fs');

function getFileMD5(filePath) {
    return new Promise((resolve, reject) => {
        const hash = crypto.createHash('md5');
        const stream = fs.createReadStream(filePath);
        
        stream.on('data', (chunk) => {
            hash.update(chunk);
        });
        
        stream.on('end', () => {
            resolve(hash.digest('hex'));
        });
        
        stream.on('error', reject);
    });
}

使用blueimp-md5库(前端)

// 引入blueimp-md5库
const md5 = require('blueimp-md5');

// 计算文件的MD5值
function getFileMD5(file) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = function(e) {
            const binaryString = e.target.result;
            const fileMD5 = md5(binaryString);
            resolve(fileMD5);
        };
        reader.onerror = reject;
        reader.readAsBinaryString(file);
    });
}

Python

Python获取文件MD5值非常简单,标准库hashlib提供了完整的支持:

方法一:分块读取(推荐,适合大文件)

import hashlib

def get_file_md5(filepath):
    """
    计算文件的MD5值(分块读取,内存友好)
    """
    md5_hash = hashlib.md5()
    try:
        with open(filepath, 'rb') as f:
            # 每次读取8KB数据块
            for chunk in iter(lambda: f.read(8192), b""):
                md5_hash.update(chunk)
        return md5_hash.hexdigest()
    except FileNotFoundError:
        print(f"文件 {filepath} 不存在")
        return None
    except Exception as e:
        print(f"读取文件时出错: {e}")
        return None

# 使用示例
md5_value = get_file_md5("example.txt")
if md5_value:
    print(f"文件MD5: {md5_value}")

方法二:一次性读取(仅适用于小文件)

import hashlib

def get_file_md5_simple(filepath):
    """
    计算文件的MD5值(一次性读取,简单但占用内存)
    """
    try:
        with open(filepath, 'rb') as f:
            data = f.read()
            return hashlib.md5(data).hexdigest()
    except Exception as e:
        print(f"错误: {e}")
        return None

方法三:使用pathlib(现代Python风格)

import hashlib
from pathlib import Path

def get_file_md5_pathlib(filepath):
    """
    使用pathlib计算文件MD5值
    """
    file_path = Path(filepath)
    if not file_path.exists():
        return None
        
    md5_hash = hashlib.md5()
    with file_path.open('rb') as f:
        for chunk in iter(lambda: f.read(8192), b""):
            md5_hash.update(chunk)
    return md5_hash.hexdigest()

方法四:计算字符串的MD5

import hashlib

def get_string_md5(text):
    """
    计算字符串的MD5值
    """
    return hashlib.md5(text.encode('utf-8')).hexdigest()

# 使用示例
text_md5 = get_string_md5("Hello, World!").upper()
print(f"字符串MD5: {text_md5}")

说明

  1. 性能考虑:对于大文件,推荐使用分块读取的方式(如Golang的TeeReader、C++和C的循环读取),避免一次性加载整个文件到内存。

  2. 安全性:MD5算法已不推荐用于安全敏感场景(如密码存储),但仍然适用于文件完整性验证。

  3. 库依赖:Java需要Apache Commons Codec,C/C++需要OpenSSL,JavaScript需要第三方库(如crypto-js)。

  4. 实现差异:不同语言的实现原理相似,都是通过哈希算法计算文件内容的哈希值,区别主要在于文件读取方式和十六进制转换方法。