0

0

怎么用C++计算文件哈希值?MD5/SHA实现

P粉602998670

P粉602998670

发布时间:2025-06-25 21:28:01

|

891人浏览过

|

来源于php中文网

原创

明确答案:在c++中计算文件哈希值的方法主要有三种。1. 使用openssl库;2. 自己实现md5算法;3. 使用其他轻量级库如crypto++。详细描述如下:使用openssl时,需安装开发库、包含相应头文件、逐块读取文件并更新哈希上下文,最后获取结果;自己实现适合学习,但需处理填充消息、分块处理、寄存器初始化等流程,并注意大小端和位操作问题;crypto++是更现代的替代方案,通过组合filesource、hashfilter和hexencoder即可完成计算。注意事项包括分块读取避免内存溢出、以二进制模式打开文件、处理字节序差异以及可扩展为命令行工具

怎么用C++计算文件哈希值?MD5/SHA实现

计算文件的哈希值在数据完整性验证、数字签名等领域非常常见。C++中可以通过调用第三方库或自己实现算法来完成,比如常用的MD5和SHA系列哈希算法。

怎么用C++计算文件哈希值?MD5/SHA实现

下面介绍几种常见的方法,帮助你快速上手用C++计算文件的哈希值。

怎么用C++计算文件哈希值?MD5/SHA实现

使用 OpenSSL 库计算 MD5 或 SHA 哈希

OpenSSL 是一个广泛使用的加密库,支持多种哈希算法。使用它计算文件哈希是目前最简单有效的方式之一。

立即学习C++免费学习笔记(深入)”;

步骤如下:

怎么用C++计算文件哈希值?MD5/SHA实现
  • 安装 OpenSSL 开发库(Linux 下可以用 apt install libssl-dev
  • 在 C++ 项目中包含头文件
  • 打开文件并逐块读取内容,更新哈希上下文
  • 最后调用 MD5_Final()SHA256_Final() 获取最终哈希值
#include 
#include 
#include 
#include 

void compute_md5(const std::string& filename) {
    std::ifstream file(filename, std::ios::binary);
    if (!file) {
        std::cerr << "无法打开文件\n";
        return;
    }

    MD5_CTX ctx;
    MD5_Init(&ctx);

    char buffer[4096];
    while (file.read(buffer, sizeof(buffer))) {
        MD5_Update(&ctx, buffer, file.gcount());
    }

    unsigned char hash[MD5_DIGEST_LENGTH];
    MD5_Final(hash, &ctx);

    for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {
        printf("%02x", hash[i]);
    }
    std::cout << std::endl;
}

SHA 系列类似,只需替换对应的函数名即可,比如 SHA256_Init, SHA256_Update, SHA256_Final


自己实现 MD5 算法(适合学习)

如果你不想依赖外部库,也可以尝试自己实现 MD5 算法。不过这种方式更适合理解原理,实际开发中不推荐,因为容易出错且效率不高。

自由画布
自由画布

百度文库和百度网盘联合开发的AI创作工具类智能体

下载

实现要点:

  • 需要先了解 MD5 的基本流程:填充消息、分块处理、初始化寄存器、主循环运算等
  • 要处理大端小端问题
  • 需要自己实现位操作、循环左移等基础功能

可以参考 RFC 1321 文档,里面有完整的算法描述。对于新手来说,建议先从阅读开源实现开始,比如查看 MD5 的 C 实现代码,再逐步改写成 C++。


使用其他轻量级库(如 Crypto++)

如果你不想用 OpenSSL,也可以选择更现代的加密库,比如 Crypto++。它跨平台、接口友好,适合嵌入式或小型项目。

使用示例:

#include 
#include 
#include 
#include 

void compute_sha256(const std::string& filename) {
    CryptoPP::SHA256 hash;
    CryptoPP::FileSource fs(filename.c_str(), true,
        new CryptoPP::HashFilter(hash, new CryptoPP::HexEncoder(new CryptoPP::FileSink(std::cout))));
}

这段代码会把文件的 SHA-256 哈希以十六进制形式输出到控制台。


注意事项与细节提醒

  • 文件过大时不要一次性加载内存,应该分块读取,避免内存溢出。
  • 注意二进制模式打开文件,否则 Windows 下可能会出错。
  • 不同系统对字节序的处理可能不同,涉及网络传输或跨平台使用时要注意。
  • 如果只是想做一个工具,可以考虑结合命令行参数解析,做成通用的小工具。

基本上就这些了。用 C++ 计算文件哈希其实不复杂,但容易忽略一些底层细节。选择合适的库或者理解清楚算法逻辑,就能轻松搞定。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1079

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

169

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1382

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

17

2026.01.19

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

739

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1128

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

799

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

454

2023.08.02

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.9万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号