在 ANSI C 中使用 SHA256 哈希的进度条
Progress Bar With SHA256 Hashing in ANSI C
对于我现在正在进行的项目,我想知道如何向 Openssl SHA256 哈希函数添加进度指示器。我将处理一些大文件 (1-10+ GB),并希望能够看到完成的进度与剩余的进度。我已经实施了 Stack Overflow 问题 here and here,并且 SHA256 哈希生成工作正常(它只是缺少进度指示器)。
我对 C 还很陌生,所以这对我来说将是一次学习经历。我以为我可以以某种方式使用 fread 或 SHA256_Update,但我无法准确理解我将如何获得已读取文件量的响应。
char _genSHA256Hash(char *path, char outputBuffer[65])
{
FILE *file = fopen(path, "rb");
if(!file) return -1;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
const int bufSize = 32768;
char *buffer = malloc(bufSize);
int bytesRead = 0;
if(!buffer) return -1;
while((bytesRead = fread(buffer, 1, bufSize, file)))
{
SHA256_Update(&sha256, buffer, bytesRead);
}
SHA256_Final(hash, &sha256);
sha256_hash_string(hash, outputBuffer);
//fclose(file);
//free(buffer);
return 0;
}
编辑:我添加了 sha256_hash_string 函数:
void sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]) {
int i = 0;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
}
outputBuffer[64] = 0;
}
谢谢,
蒂姆
您已经知道文件的阅读量,您只需要考虑一下即可:
int bytesRead = 0;
int totRead = 0;
while((bytesRead = fread(buffer, 1, bufSize, file))) {
totRead += bytesRead;
...
您现在需要的只是文件的总大小。您可以通过以下方式获得:
struct stat sb;
if (stat(path, &sb) == -1) {
perror("stat");
return 0;
}
totRead
保留一个 运行 计数器;每次循环都会重置 bytesRead。然后,在您的循环中,totRead / sb.st_size
表示您的哈希进度的百分比。
对于我现在正在进行的项目,我想知道如何向 Openssl SHA256 哈希函数添加进度指示器。我将处理一些大文件 (1-10+ GB),并希望能够看到完成的进度与剩余的进度。我已经实施了 Stack Overflow 问题 here and here,并且 SHA256 哈希生成工作正常(它只是缺少进度指示器)。
我对 C 还很陌生,所以这对我来说将是一次学习经历。我以为我可以以某种方式使用 fread 或 SHA256_Update,但我无法准确理解我将如何获得已读取文件量的响应。
char _genSHA256Hash(char *path, char outputBuffer[65])
{
FILE *file = fopen(path, "rb");
if(!file) return -1;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
const int bufSize = 32768;
char *buffer = malloc(bufSize);
int bytesRead = 0;
if(!buffer) return -1;
while((bytesRead = fread(buffer, 1, bufSize, file)))
{
SHA256_Update(&sha256, buffer, bytesRead);
}
SHA256_Final(hash, &sha256);
sha256_hash_string(hash, outputBuffer);
//fclose(file);
//free(buffer);
return 0;
}
编辑:我添加了 sha256_hash_string 函数:
void sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]) {
int i = 0;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
}
outputBuffer[64] = 0;
}
谢谢,
蒂姆
您已经知道文件的阅读量,您只需要考虑一下即可:
int bytesRead = 0;
int totRead = 0;
while((bytesRead = fread(buffer, 1, bufSize, file))) {
totRead += bytesRead;
...
您现在需要的只是文件的总大小。您可以通过以下方式获得:
struct stat sb;
if (stat(path, &sb) == -1) {
perror("stat");
return 0;
}
totRead
保留一个 运行 计数器;每次循环都会重置 bytesRead。然后,在您的循环中,totRead / sb.st_size
表示您的哈希进度的百分比。