Полиномиальная хеш-функция — это популярный метод хеширования строк, который часто используется из-за своей простоты и эффективности. Она преобразует строку в хеш-значение, используя полином с коэффициентами, определяемыми символами строки.
Идея полиномиальной хеш-функции
Основная идея заключается в том, чтобы представить строку как многочлен с коэффициентами, равными числовым значениям символов строки. Затем этот многочлен вычисляется по модулю некоторого большого числа, что позволяет избежать переполнения и равномерно распределяет хеш-значения.
Формула полиномиальной хеш-функции
Полиномиальная хеш-функция для строки длиной символов может быть определена как: где:
- — числовое значение -го символа строки.
- — некоторое фиксированное простое число (обычно используется значение 31 или 37).
- — большое простое число для вычисления остатка (например, или другое большое простое число).
Пример реализации на C++
Ниже приведен пример реализации полиномиальной хеш-функции на языке C++:
#include <iostream>
#include <string>
unsigned int polynomialHash(const std::string &key, int prime = 31, int mod = 1000000007) {
unsigned int hash = 0;
unsigned int power = 1;
for (char ch : key) {
hash = (hash + (ch * power) % mod) % mod;
power = (power * prime) % mod;
}
return hash;
}
int main() {
std::string key1 = "hello";
std::string key2 = "world";
std::string key3 = "polynomial";
std::string key4 = "hash";
std::cout << "Hash of " << key1 << " : " << polynomialHash(key1) << std::endl;
std::cout << "Hash of " << key2 << " : " << polynomialHash(key2) << std::endl;
std::cout << "Hash of " << key3 << " : " << polynomialHash(key3) << std::endl;
std::cout << "Hash of " << key4 << " : " << polynomialHash(key4) << std::endl;
return 0;
}
Объяснение кода
-
Функция
polynomialHash
:- Принимает строку
key
, простое числоprime
(по умолчанию 31) и модульmod
(по умолчанию 1000000007). - Инициализирует переменную
hash
для хранения итогового хеш-значения и переменнуюpower
, представляющую текущую степень простого числа.
- Принимает строку
-
Цикл по символам строки:
- Для каждого символа
ch
строкиkey
:- Обновляет
hash
, добавляя произведение символа и текущей степени простого числаprime
, взятое по модулюmod
. - Обновляет
power
, умножая его наprime
и взяв по модулюmod
.
- Обновляет
- Для каждого символа
-
Функция
main
:- Определяет несколько строк и вычисляет их хеш-значения, выводя результаты на экран.
Преимущества полиномиальной хеш-функции
- Простота и эффективность: Легко реализуется и быстро вычисляется.
- Равномерное распределение: Обеспечивает хорошее распределение хеш-значений для большинства строк.
- Устойчивость к коллизиям: При правильном выборе простого числа и модуля вероятность коллизий уменьшается.
Недостатки полиномиальной хеш-функции
- Чувствительность к выбору параметров: Результаты зависят от выбора и , что требует тщательного подбора этих значений.
- Проблемы с переполнением: Без использования модуля вычисления могут приводить к переполнению целых чисел.
Полиномиальная хеш-функция широко используется в различных алгоритмах и структурах данных, включая хеш-таблицы, для обеспечения быстрого и эффективного поиска, вставки и удаления строк.