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;
}
posted @ 2026-04-09 21:41  爱情丶眨眼而去  阅读(14)  评论(0)    收藏  举报