将包含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;
}
假设我有从文件的 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;
}