将包含char和int的字符串转换为C中的整数

Converting a string containing both char's and int's into an integer in C

假设我有从文件的 strSHA2 散列中给出的字符串(表示为字符指针):

"f731d405b522b69d79f2495f0963e48d534027cc1852dd99fa84ef1f5f3387ee"

我怎样才能有效地将它变成一个整数?有什么办法可以投吗? atoi() 一到达字符就终止。

使用 letter - 'a' 等算术遍历和转换 char 是否是最好的方法?

我打算将其用作散列的索引 table,因此需要一个整数。

整数的长度将是 C 的标准 32 位

为了将十六进制字符串转换为 32 位无符号整数数据类型,您可以使用函数 strtoul.

但是,32 位无符号整数数据类型只能表示最大为 232-1 的数字,这在您的 256 位数字示例中是不够的.

因此,只能将此数转换为8个32位整数。

但是,正如其他答案之一所指出的,将 256 位索引用于散列 table 是没有意义的。由于您可能假设 SHA-2 哈希的所有位对于您的用例都足够均匀地分布,因此只需获取 SHA-2 哈希的前 10 或 16 位并将它们用作索引到您的哈希 table。这样,您的哈希 table 的长度将在 8 KiB 或 512 KiB 之间,假设每个哈希 table 条目有 8 个字节。

Say I have the string (represented as a char pointer) given from a strSHA2 hash of a file:

那就是 256 位整数的十六进制表示。

您的计算机没有 256 位整数类型,因此您可能无法转换它。

相反,您需要使用与哈希库不同的函数,该函数不会为您提供 printable 字符串,而只会提供 32 字节的原始哈希数据。然后,您可以使用高 2 个字节作为散列 table 索引。

使用 32 字节(256 位)散列 table 索引毫无意义 – 这个世界上没有一台计算机有足够的内存来存储 table 和 2²⁵⁶ 条目。

不过,老实说,如果您想要哈希 table,请使用现有的哈希 table 而不是构建您自己的哈希。

您可能想将由 SHA2 字符串的前 8 个字符组成的十六进制数转换为无符号整数(32 位),这对我来说是一个非常好的哈希函数,因为两个不同的 sha2 不太可能哈希以相同的 8 个字节开头:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

unsigned int GetHashValueFromSHA2String(const char *sha2string)
{
  char first[9];
  memcpy(first, sha2string, 8);  // copy first 8 chars of sha2 string
  first[8] = 0;                  // null terminate
  return strtoul(first, NULL, 16);
}

int main()
{
  unsigned int hashvalue = GetHashValueFromSHA2String("f731d405b522b69d79f2495f0963e48d534027cc1852dd99fa84ef1f5f3387ee");
  printf("Hashvalue = %08x", hashvalue);
}

或者更简单:

unsigned int GetHashValueFromSHA2String(const char *sha2string)
{
  unsigned int value;
  sscanf(sha2string, "%8x", &value);
  return value;
}