对于我正在进行的项目,我想知道如何在Openssl SHA256散列函数中添加进度指示器。我将使用一些大文件(1-10 + GB),并希望能够看到完成的进度与左对比。我已经实现了Stack Overflow问题here和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;
}
谢谢,
添
答案 0 :(得分:1)
您已经掌握了有关已读取文件的数量的信息,您只需要考虑它:
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
表示散列进度的百分比。