Perl-хеш - это массив связанных списков.
+--------+ +--------+
| -------->| |
+--------+ +--------+
| | | key1 |
+--------+ +--------+
| ------+ | val1 |
+--------+ | +--------+
| | |
+--------+ | +--------+ +--------+
+-->| ------>| |
+--------+ +--------+
| key2 | | key3 |
+--------+ +--------+
| val2 | | val3 |
+--------+ +--------+
Функция хеширования создает значение, которое используется в качестве индекса массива, затем выполняется линейный поиск связанного связанного списка.
Это означает, что худший случай для поиска - O (N).Так почему люди говорят, что это O (1)?Вы могли бы заявить, что если бы удерживали список от превышения некоторой постоянной длины, и это то, что делает Perl.Для этого используются два механизма:
- Увеличение количества сегментов.
- Возмущающий алгоритм хеширования.
Удвоение количества сегментов должно делитьколичество записей в данной половине в среднем.Например,
305419896 % 4 = 0 and 943086900 % 4 = 0
305419896 % 8 = 0 and 943086900 % 8 = 4
Однако злоумышленник может выбрать значения там, где этого не происходит.Вот где в игру вступает возмущение хэшем.Каждый хэш имеет свое собственное случайное число, которое мешает (вызывает отклонения) выводу алгоритма хеширования.Поскольку злоумышленник не может предсказать случайное число, он не может выбрать значения, которые вызовут столкновения.При необходимости Perl может перестроить хэш, используя новое случайное число, в результате чего ключи отображаются в другие сегменты, чем раньше, и, таким образом, разбиваются длинные цепочки.