C++ 文件 SHA256 校验和比较:找出差异元素
使用 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;
}
代码说明
sha256(string filename)函数: 计算指定文件的 SHA256 校验和,并将结果以十六进制字符串形式返回。get_sha256_values(string path)函数: 获取指定目录下所有文件的 SHA256 校验和,并将其存储在vector中返回。compare_arrays(vector<string>& array1, vector<string>& array2)函数: 比较两个字符串数组,找出第一个数组中比第二个数组中多的元素,并将这些元素存储在vector中返回。main函数: 获取文件夹中所有文件的 SHA256 校验和,从文件中读取字符串,比较两个数组,并将结果输出。
使用说明
- 将代码保存为
.cpp文件,并使用支持 C++ 和 OpenSSL 的编译器进行编译。 - 替换代码中的
'path/to/folder'和'path/to/file'为实际的文件夹路径和文件路径。 - 运行编译后的可执行文件,即可查看结果。
注意
- 确保已安装 OpenSSL 库并配置了相关路径。
- 文件夹和文件的路径需要根据实际情况进行修改。
- 此代码仅供参考,可能需要根据具体情况进行调整。
原文地址: https://www.cveoy.top/t/topic/n2tU 著作权归作者所有。请勿转载和采集!