假設我有從檔案的 strSHA2 散列給出的字串(表示為字符指標):
"f731d405b522b69d79f2495f0963e48d534027cc1852dd99fa84ef1f5f3387ee"
我怎樣才能有效地把它變成一個整數?有什么辦法可以投嗎?atoi() 一旦到達一個字符就終止。
使用算術迭代和轉換字符letter - 'a'是最好的方法嗎?
我打算將它用作哈希表的索引,因此需要一個整數。
整數的長度將是 C 的標準 32 位
uj5u.com熱心網友回復:
您可能想將由 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 = x", hashvalue);
}
或者更簡單:
unsigned int GetHashValueFromSHA2String(const char *sha2string)
{
unsigned int value;
sscanf(sha2string, "%8x", &value);
return value;
}
uj5u.com熱心網友回復:
假設我有從檔案的 strSHA2 散列給出的字串(表示為字符指標):
那就是 256 位整數的十六進制表示。
您的計算機沒有 256 位整數型別,因此您可能無法強制轉換。
相反,您需要使用散列庫中的不同函式,該函式不會為您提供可列印的字串,而只會提供 32 位元組的原始散列資料。然后,您可以使用上面的 2 個位元組作為哈希表索引。
使用 32 位元組(256 位)哈希表索引是沒有意義的——這個世界上沒有任何計算機有足夠的記憶體來存盤具有 22?? 個條目的表。
但是,老實說,如果您想要一個哈希表,請使用現有的哈希表而不是構建您自己的哈希表。
uj5u.com熱心網友回復:
為了將十六進制字串轉換為 32 位無符號整數資料型別,您可以使用函式strtoul.
但是,32 位無符號整數資料型別只能表示最多 2 32 -1 的數字,這在您的 256 位數字示例中是不夠的。
因此,只能將此數字轉換為 8 個 32 位整數。
但是,正如其他答案之一所指出的那樣,在哈希表中使用 256 位索引是沒有意義的。由于您可能會假設 SHA-2 散列的所有位對于您的用例都充分均勻分布,因此只需取 SHA-2 散列的前 10 位或 16 位并將它們用作索引到您的哈希表中。這樣,假設每個哈希表條目有 8 個位元組,您的哈希表的長度將介于 8 KiB 或 512 KiB 之間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317672.html
上一篇:將分隔的字串/文本轉換為地圖物件
下一篇:找到第一個非空和非空字串值
