将 sha 256 哈希转换为 c 中的数字

标签 c hash type-conversion

我有一个 16MB 的文件。我想每次取出 16 字节数据 block ,使用 SHA256 对其进行哈希处理,然后使用结果指向要哈希的 16 字节 block 的下一个位置。

例如,

#include <openssl/aes.h>
#include <openssl/sha.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


#define BLOCKSIZE 1048576
#define SUBBLOCKSIZE 16

int main(void) {

  SHA256_CTX ctx;
  int SHA256_Init(SHA256_CTX *ctx);
  u_int8_t results[32];

  FILE *infile;
  char buf[SUBBLOCKSIZE];
  int bufsize = SUBBLOCKSIZE;

  infile = fopen("sample.dat", "r");
  int i = 0;
  int n;

  while (fread(buf, SUBBLOCKSIZE, 1, infile) != NULL) {
    SHA256_Init(&ctx);
    n = strlen(buf);
    SHA256_Update(&ctx, (u_int8_t *)buf, n);
    SHA256_Final(results, &ctx);

    //fseek here.....

    i++;
  }

  return 0;
}

在我的代码中,“结果”是 SHA256 的哈希结果。我想将它转换为 256 位数字并按 1024(或其他任意整数)对其进行 mod。然后我使用结果作为 fseek 中的输入来定位到下一个文件指针。

我想知道如何将“结果”转换为 256 位数字?

最佳答案

直接的答案是使用一个处理大整数的库。对于C the OpenSSL BN_ functions仅举一个明显的例子,对大数执行操作。

不太直接的答案是简单地使用结果数组的 256 位/32 字节中的 64 位/8 字节(最左边)位,并将其放入 64 位“长”数字( int64_t 可能是最好的)。然后你可以简单地检索模 x使用 % 获得该值运算符。

请注意,结果在限制上很好地分布 x那不是二的幂。在这种情况下,您可能需要丢弃任何数字 r等于或大于 x * n哪里n是最大值,其中 x * n仍然适合 64 位。如果您不丢弃这些值,那么您有(微小)更高的机会得到较低的值。

当然,如果你的结果恰好是幂 p 2 那么你不妨采取 p (最左边的)位并将这些位解释为大小相同或更大的无符号整数。

关于将 sha 256 哈希转换为 c 中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465886/

相关文章:

r - data.frame 到 timeseries 对象

c - 为什么以及在何种意义上 pthread_t 是不透明类型?

c - 如何在 C 中获取 float 数组中的项目数?

hash - HMAC 执行失败

type-conversion - C#中的类型转换

c# - OpenCV C++ vector DMatch 到 C#

android - 现有文件中不存在 NDK 构建报告文件

c - 随机数生成-未声明的标识符

C++ 将十六进制 md5 哈希转换为十进制整数

perl - 如何从具有键的数组和具有值的另一个数组中进行Perl哈希处理?