Скажем, у меня есть строка (представленная как указатель на символ), полученная из хэша strSHA2 файла:

"f731d405b522b69d79f2495f0963e48d534027cc1852dd99fa84ef1f5f3387ee"

Как я мог эффективно превратить его в целое число? Есть ли способ его закинуть? atoi () завершается, как только достигает символа.

Будет ли перебор и преобразование char с использованием арифметики, такой как letter - 'a', лучшим способом?

Я собираюсь использовать его в качестве индекса для хеш-таблицы, поэтому мне нужно целое число.

Длина целого числа будет стандартной 32-битной для C

0
Lewis Hellewell 15 Окт 2021 в 12:50

3 ответа

Лучший ответ

Вероятно, вы хотите преобразовать шестнадцатеричное число, состоящее из первых 8 символов строки SHA2, в целое число без знака (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;
}
2
Jabberwocky 15 Окт 2021 в 11:39

Скажем, у меня есть строка (представленная как указатель на символ), полученная из хэша strSHA2 файла:

Это шестнадцатеричное представление 256-битного целого числа.

На вашем компьютере нет 256-битного целочисленного типа, поэтому вы, возможно, не можете его преобразовать.

Вместо этого вы захотите использовать другую функцию из своей библиотеки хеширования, которая дает вам не печатаемую строку, а всего 32 байта необработанных хеш-данных. Затем вы можете использовать, скажем, верхние 2 байта в качестве индексов хеш-таблицы.

Использование 32-байтового (256-битного) индекса хэш-таблицы не имеет смысла - ни один компьютер в этом мире не имеет достаточно памяти для таблицы с 2² записями.

Однако честно говоря, если вам нужна хеш-таблица, используйте существующую хеш-таблицу вместо создания своей собственной.

1
Marcus Müller 15 Окт 2021 в 10:00

Чтобы преобразовать шестнадцатеричную строку в 32-битный целочисленный тип данных без знака, вы можете использовать функцию strtoul.

32

Следовательно, это число можно было бы преобразовать только в восемь 32-битных целых чисел.

Однако, как указано в одном из других ответов, нет смысла использовать 256-битный индекс в хеш-таблице. Поскольку вы, вероятно, можете предположить, что все биты хэша SHA-2 достаточно равномерно распределены для вашего варианта использования, должно быть достаточно просто взять первые 10 или 16 бит хэша SHA-2 и использовать их как index в вашу хеш-таблицу. Таким образом, ваша хеш-таблица будет иметь длину от 8 до 512 КиБ, при условии 8 байтов на запись в хеш-таблице.

0
Andreas Wenzel 15 Окт 2021 в 10:41