#c #hashtable #type-conversion #hash
#c #хэш-таблица #преобразование типов #хэш
Вопрос:
Например, «foobar» должен хэшироваться примерно до 3456. Мой массив хэш-таблицы имеет размер 811, поэтому моя хэш-функция выполнит 3456% 811, чтобы найти позицию в хэш-таблице для размещения «foobar».
Есть предложения?
Комментарии:
1. en.wikipedia.org/wiki/List_of_hash_functions
2. @Саид Амири: Его массив хэш-таблиц имеет размер 811. Это не ограничивает его реализацию 811 строками…
3. Более полный ответ на programmers.stackexchange.com/q/49550/15162
Ответ №1:
Я предлагаю djb2 из хэш-функций
djb2
об этом алгоритме (k = 33) впервые сообщил Дэн бернштейн много лет назад в comp.lang.c. другая версия этого алгоритма (теперь предпочитаемая бернштейном) использует xor:
hash(i) = hash(i - 1) * 33 ^ str[i]
; магия числа 33 (почему оно работает лучше, чем многие другие константы, простые или нет) никогда не была адекватно объяснена.
unsigned long hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str )
hash = ((hash << 5) hash) c; /* hash * 33 c */
return hash;
}
Также представляет интерес
цитируется lose lose
реализация из оригинальной книги K amp; R. Хороший пример того, как не хэшировать вашу строку.
Ответ №2:
Повысить функциональность / хэш
http://www.boost.org/doc/libs/1_47_0/doc/html/hash/tutorial.html
#include <boost/functional/hash.hpp>
int main()
{
boost::hash<std::string> string_hash;
std::size_t h = string_hash("Hash me");
size_t table_index = h % 811;
}
Комментарии:
1. Это интересно. Хотя я хотел бы сам создать реальную (простую) хэш-функцию. На самом деле я бы, вероятно, так и сделал, но это всего лишь упражнение.
Ответ №3:
Вы можете использовать функцию build it stdlib:
#include <stdlib.h>
i = atoi(char *);
Он возвращает целочисленное значение этой строки.
Комментарии:
1. @delnan: Но это возможный метод хэширования … возможный, но очень плохой 🙂
2. Мне придется попробовать это… Я хочу простого, независимо от эффективности. Это только для упражнения.
3. Кто бы ни отклонил этот ответ: почему? Это, кажется, правильный ответ, независимо от того, насколько он «плохой».