使用ANSI C中的SHA256哈希进度条

时间:2015-01-03 03:22:08

标签: c hash sha256

对于我正在进行的项目,我想知道如何在Openssl SHA256散列函数中添加进度指示器。我将使用一些大文件(1-10 + GB),并希望能够看到完成的进度与左对比。我已经实现了Stack Overflow问题herehere,并使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;
}

谢谢,

1 个答案:

答案 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表示散列进度的百分比。