使用 C++ 获取文件夹中所有文件的 SHA256 校验和,并与另一个文件中的字符串进行比较

本代码演示了如何使用 C++ 获取指定文件夹中所有文件的 SHA256 校验和,并将其与另一个文件中按行读取的字符串进行比较,找出第一个数组中比第二个数组中多了哪些元素。

代码实现

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstring>
#include <openssl/sha.h>
#include <dirent.h>

using namespace std;

// 计算文件的 SHA256 值
string sha256(string filename) {
    ifstream file(filename, ios::binary);
    if (!file) {
        return '';
    }
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    char buffer[1024];
    while (file.read(buffer, sizeof(buffer))) {
        SHA256_Update(&sha256, buffer, sizeof(buffer));
    }
    SHA256_Final((unsigned char*)buffer, &sha256);
    file.close();
    string result;
    char hex[3];
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        sprintf(hex, '%02x', buffer[i]);
        result += hex;
    }
    return result;
}

// 获取指定目录下所有文件的 SHA256 值
vector<string> get_sha256_values(string path) {
    vector<string> sha256_values;
    DIR* dir = opendir(path.c_str());
    if (!dir) {
        return sha256_values;
    }
    struct dirent* entry;
    while ((entry = readdir(dir))) {
        if (entry->d_type == DT_REG) {
            string filename = path + '/' + entry->d_name;
            string sha256_value = sha256(filename);
            if (!sha256_value.empty()) {
                sha256_values.push_back(sha256_value);
            }
        }
    }
    closedir(dir);
    return sha256_values;
}

// 比较两个字符串数组,找出第一个数组中比第二个数组中多的元素
vector<string> compare_arrays(vector<string>& array1, vector<string>& array2) {
    vector<string> result;
    bool* flags = new bool[array2.size()];
    memset(flags, false, array2.size());
    for (string value1 : array1) {
        bool found = false;
        for (int i = 0; i < array2.size(); i++) {
            if (!flags[i] && value1 == array2[i]) {
                flags[i] = true;
                found = true;
                break;
            }
        }
        if (!found) {
            result.push_back(value1);
        }
    }
    delete[] flags;
    return result;
}

int main() {
    // 获取文件夹中所有文件的 SHA256 值
    vector<string> sha256_values = get_sha256_values('path/to/folder');
    // 从文件中按行读取字符串插入另一个数组
    vector<string> array2;
    ifstream file('path/to/file');
    if (file) {
        string line;
        while (getline(file, line)) {
            array2.push_back(line);
        }
        file.close();
    }
    // 比较两个字符串数组,找出第一个数组中比第二个数组中多的元素
    vector<string> result = compare_arrays(sha256_values, array2);
    // 输出结果
    for (string value : result) {
        cout << value << endl;
    }
    return 0;
}

代码说明

  1. sha256(string filename) 函数: 计算指定文件的 SHA256 校验和,并将结果以十六进制字符串形式返回。
  2. get_sha256_values(string path) 函数: 获取指定目录下所有文件的 SHA256 校验和,并将其存储在 vector 中返回。
  3. compare_arrays(vector<string>& array1, vector<string>& array2) 函数: 比较两个字符串数组,找出第一个数组中比第二个数组中多的元素,并将这些元素存储在 vector 中返回。
  4. main 函数: 获取文件夹中所有文件的 SHA256 校验和,从文件中读取字符串,比较两个数组,并将结果输出。

使用说明

  1. 将代码保存为 .cpp 文件,并使用支持 C++ 和 OpenSSL 的编译器进行编译。
  2. 替换代码中的 'path/to/folder''path/to/file' 为实际的文件夹路径和文件路径。
  3. 运行编译后的可执行文件,即可查看结果。

注意

  • 确保已安装 OpenSSL 库并配置了相关路径。
  • 文件夹和文件的路径需要根据实际情况进行修改。
  • 此代码仅供参考,可能需要根据具体情况进行调整。
C++ 文件 SHA256 校验和比较:找出差异元素

原文地址: https://www.cveoy.top/t/topic/n2tU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录