C++ 加密算法计算
C++ 加密算法计算
抽象如下方法
#include <openssl/evp.h>
#include <format>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>
std::string calculateFileMD5(const std::string& digest,
const std::string& filePath) {
std::ifstream file(filePath, std::ios::binary);
if (!file) return "Error: Cannot open file";
// 1. 创建并初始化上下文
EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
const EVP_MD* md = "NULL" == digest ? EVP_md_null() : EVP_get_digestbyname(digest.c_str());
if (md == nullptr || EVP_DigestInit_ex(mdctx, md, nullptr) != 1) {
EVP_MD_CTX_free(mdctx);
return std::format("Error: {} init failed", digest);
}
// 2. 分块读取
char buffer[4096];
while (file.read(buffer, sizeof(buffer)) || file.gcount()) {
EVP_DigestUpdate(mdctx, buffer, file.gcount());
}
// 3. 获取结果
unsigned char result[EVP_MAX_MD_SIZE];
unsigned int resultLen = 0;
EVP_DigestFinal_ex(mdctx, result, &resultLen);
// 4. 清理
EVP_MD_CTX_free(mdctx);
// 二进制转十六进制字符串
std::stringstream ss;
for (unsigned int i = 0; i < resultLen; ++i) {
ss << std::hex << std::setw(2) << std::setfill('0') << (int)result[i];
}
return ss.str();
}
auto main(const int argc, const char** const argv) -> int {
std::cout << "支持算法如下:\n";
// 遍历所有可用的摘要算法并执行回调
EVP_MD_do_all_provided(
nullptr,
[](EVP_MD* md, void*) {
const char* const algorithm = EVP_MD_get0_name(md);
std::cout << algorithm << std::endl; // Null Digest
},
nullptr);
std::cout << "Hello, World!" << std::endl;
if (argc > 2) {
std::cout << argv[2] << ": " << "[" << calculateFileMD5(argv[1], argv[2]) << "]"
<< std::endl;
} else {
std::cout << "Usage: " << argv[0] << " <digest> <file_path>"
<< std::endl;
}
return 0;
}
// https://www.bilibili.com/video/BV13Q4y1C7hS?spm_id_from=333.788.player.switch&vd_source=fb5fc0881b2bb1a411566e5b2f1c7c7e&p=115
Null Digest为空摘要算法。
cmake配置
cmake_minimum_required(VERSION 3.10.0)
project(object_model_01 VERSION 0.1.0 LANGUAGES C CXX)
# ✅ 设置 C++ 标准
set(CMAKE_CXX_STANDARD 26) # 使用 C++26 标准
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用指定标准
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器扩展(使用纯标准)
# 查找源文件
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS
"src/*.cpp"
"src/*.c"
)
add_executable(${CMAKE_PROJECT_NAME} main.cpp ${SOURCES})
# 设置头文件包含路径
target_include_directories(${CMAKE_PROJECT_NAME}
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/learn01
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/learn02
)
# 1. 寻找 OpenSSL 软件包
find_package(OpenSSL REQUIRED)
# 3. 链接 OpenSSL 库
# OpenSSL::Crypto 对应你命令行里的 -lcrypto
# 如果你需要用到 SSL 相关功能(如 https),可以再加上 OpenSSL::SSL
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE OpenSSL::Crypto)
# 可选:打印找到的路径,方便调试
message(STATUS "OpenSSL Include: ${OPENSSL_INCLUDE_DIR}")
message(STATUS "OpenSSL Libraries: ${OPENSSL_LIBRARIES}")
if(MSVC)
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE /W4 /WX)
else()
message("no MSVC")
target_compile_options(
${CMAKE_PROJECT_NAME} PRIVATE -Wall
-Werror # 警告转错误
-Wextra # 发现更多潜在的逻辑和风格问题
-pedantic # 追求极致的标准兼容性
-D NDEBUG # 定义 NDEBUG 以禁用 assert() 的评估
)
endif()
include(CTest)
enable_testing()
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
TODO 有空看看下面文章
https://huanle19891345.github.io/en/android/性能优化/内存优化/2oom/
C++ 新特性
#include <iostream>
#include <vector>
#include <ranges>
#include <algorithm>
auto main(const int, const char** const) -> int {
std::cout << "Hello, World!" << std::endl;
const std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// C++20
auto result = nums
| std::views::filter([](int n) { return n % 2 == 0; }) // 过滤偶数
| std::views::transform([](int n) { return n * n; }) // 平方 (等同于 map)
| std::views::take(3); // 只取前3个
const auto vec = result | std::ranges::to<std::vector<int>>(); // C++23
for (const int &n : vec) {
std::cout << n << " "; // 输出: 4 16 36
}
std::cout << std::endl;
for (const int &n : result) {
std::cout << n << " "; // 输出: 4 16 36
}
return 0;
}

浙公网安备 33010602011771号