Как вы хэшируете строку? Мне нужны случайные строки, каким-то образом превращенные в целые числа, чтобы поместить их в мою хэш-таблицу

#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. Кто бы ни отклонил этот ответ: почему? Это, кажется, правильный ответ, независимо от того, насколько он «плохой».