c++ md5计算
就是使用openssl的md5接口进行了一个简单的封装:
openssl_md5.h
#ifndef OPENSSL_MD5_H
#define OPENSSL_MD5_H
#define INPUT_BUFFER_SIZE 100 * 1024
int getMd5Str(const char* data, int length, char* result, int byteSize = 32);
int getMd5File(char* filePath, char* result, int byteSize = 32);
#endif
openssl_md5.cpp
#include "openssl_md5.h"
#include <openssl/md5.h>
#include <stdio.h>
#include "string.h"
/**
* @brief Get the Md5 Str object
* 返回32位的MD5
* @param data My Param doc
* @param length strlen(data)
* @param result 返回MD5值,空间要大于33
* @return int
*/
int getMd5Str(const char* data, int length, char* result, int byteSize)
{
MD5_CTX c;
MD5_Init(&c);
MD5_Update(&c, data, length);
unsigned char digest[16] = { 0 };
char hexBuffer[3];
MD5_Final(digest, &c);
result[0] = '\0';
for (size_t i = 0; i != 16; ++i)
{
if (digest[i] < 16) sprintf(hexBuffer, "0%x", digest[i]);
else sprintf(hexBuffer, "%x", digest[i]);
strcat(result, hexBuffer);
}
result[32] = '\0';
if(byteSize == 16)
{
char temp[17];
// 如果格式化后的字符串长度大于等于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度。
snprintf(temp, 17, "%s", result + 8);
temp[16] = '\0';
sprintf(result, "%s", temp);
}
return 0;
}
int getMd5File(char* filePath, char* result, int byteSize)
{
FILE *file = fopen(filePath, "rb");
if (file)
{
MD5_CTX c;
MD5_Init(&c);
char buffer[INPUT_BUFFER_SIZE];
while (!feof(file))
{
size_t numberOfObjects = fread(buffer, sizeof(char), INPUT_BUFFER_SIZE, file);
MD5_Update(&c, buffer, numberOfObjects);
}
fclose(file);
unsigned char digest[16] = { 0 };
char hexBuffer[3];
MD5_Final(digest, &c);
result[0] = '\0';
for (size_t i = 0; i != 16; ++i)
{
if (digest[i] < 16) sprintf(hexBuffer, "0%x", digest[i]);
else sprintf(hexBuffer, "%x", digest[i]);
strcat(result, hexBuffer);
}
result[32] = '\0';
if(byteSize == 16)
{
char temp[17];
snprintf(temp, 17, "%s", result + 8);
temp[16] = '\0';
sprintf(result, "%s", temp);
}
}
else
{
return 1;
}
return 0;
}
主程序
#include <string.h>
#include "openssl_md5.h"
#include "stdio.h"
int main()
{
char result[33];
char *data = "All is well!";
getMd5Str(data, strlen(data), result);
printf("%s\n", result);
getMd5Str(data, strlen(data), result, 16);
printf("%s\n", result);
getMd5File("/home/i/images/p3.jpg", result);
printf("%s\n", result);
getMd5File("/home/i/images/p3.jpg", result, 16);
printf("%s\n", result);
return 0;
}
编译
g++ -o useMd5 useMD5.cpp openssl_md5.cpp -lssl -lcrypto
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现