【问题标题】:Progress Bar With SHA256 Hashing in ANSI CANSI C 中带有 SHA256 散列的进度条
【发布时间】:2015-03-01 07:55:58
【问题描述】:

对于我现在正在进行的一个项目,我想知道如何向 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;
}

谢谢,

提姆

【问题讨论】:

  • 你需要一个stat 或类似的东西来告诉你文件有多大,然后在循环迭代时自己计算增量。

标签: c hash sha256


【解决方案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 代表您的哈希进度百分比。

【讨论】:

  • 它返回 char 因为我这样调用函数:"char buffer[65]; _genSHA256Hash("file", buffer); printf("%s\n", buffer);"我想我可以使函数无效,只是在函数本身中打印值而不返回任何内容。
  • 函数在传递给它的缓冲区中修改数组内部的数据,与返回类型不一样。在这些情况下返回int 是惯用的——char 很奇怪,因为它基本上可以保证没有人会调用这个函数并将其结果解释为一个字符。
  • 我明白你在说什么。我想我一时糊涂了。我将更改 _genSHA256Hash 函数以返回 void 或 int。
  • 看来,当我尝试打印文件读取与左侧的大小时,bytesRead 的值始终为 32768。我在 while 循环中添加了以下语句:'printf("percent done: % d of %zu\n", bytesRead, sb.st_size);'我可以在某处上传屏幕截图供您查看,但看起来 bytesRead 始终是整数 32768,然后它突然停止并跳出循环。谢谢,蒂姆
  • 这是一张照片:pbrd.co/1tIrH2J,这是一个粘贴箱:pastebin.com/qiNz6uNh
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2022-11-07
  • 2015-01-23
  • 2012-11-29
  • 2014-01-26
  • 2013-05-15
  • 1970-01-01
相关资源
最近更新 更多