假设我有一个字符串(表示为char指针),来自文件的strSHA2哈希:
"f731d405b522b69d79f2495f0963e48d534027cc1852dd99fa84ef1f5f3387ee"
如何有效地将其转换为整数?有办法把它投出去吗?Atoi()在到达一个字符后立即终止。
将迭代和转换char's使用算术,如letter - 'a'
是最好的方式?
我打算用它作为哈希表的索引,因此需要一个整数。
整数长度为C
的标准32位您可能想要将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;
}
假设我有一个字符串(表示为char指针)从文件的strSHA2哈希中给出:
则是256位整数的十六进制表示。
您的计算机没有256位整数类型,因此您可能无法强制转换它。
相反,您将希望使用来自散列库的不同函数,该函数不给您提供可打印字符串,而只是32字节的原始散列数据。然后,您可以使用上面的2个字节作为哈希表索引。
使用一个32字节(256位)的哈希表索引是没有意义的——这个世界上没有一台计算机有足够的内存来存储一个有2个5⁶条目的表。
老实说,如果你想要一个哈希表,使用一个现有的哈希表,而不是自己构建一个。
为了将十六进制字符串转换为32位无符号整数数据类型,可以使用strtoul
函数。
但是,32位无符号整数数据类型只能表示232-1以内的数字,这对于您的256位数字示例来说是不够的。
因此,只能将这个数转换为8个32位整数。
然而,正如另一个答案所指出的那样,在哈希表中使用256位索引是没有意义的。由于您可以假设SHA-2散列的所有位对于您的用例来说都是足够均匀分布的,因此只需将SHA-2散列的前10或16位用作散列表的索引就足够了。这样,您的哈希表的长度将在8 KiB或512 KiB之间,假设每个哈希表条目8字节。