Perl использует массив со связанными списками для хранения коллизий. Он имеет простую эвристику для автоматического удвоения размера массива по мере необходимости. Также есть код для разделения ключей между хешами, чтобы сэкономить немного памяти. Вы можете прочитать об этом в датированном, но все еще актуальном Perl Illustrated Guts в разделе "HV". Если вы действительно любите приключения, вы можете покопаться в hv.c .
Раньше алгоритм хэширования был довольно простым, но теперь он, вероятно, намного сложнее с Unicode. Поскольку алгоритм был предсказуемым, была DoS-атака, в результате которой злоумышленник генерировал данные, которые вызывали хэш-конфликты. Например, огромный список ключей, отправляемых на веб-сайт в виде POST-данных. Программа Perl, скорее всего, разделит его и выбросит в хеш, который затем поместит все в одно ведро. Полученный хэш был O (n), а не O (1). Бросьте много запросов POST на сервер, и вы можете засорить процессор. В результате Perl теперь мешает хэш-функции с небольшим количеством случайных данных.
Вы также можете посмотреть , как Parrot реализует базовые хеши , что значительно менее страшно, чем реализация Perl 5.
Что касается «наиболее эффективного и практичного», используйте чужую хеш-библиотеку. Ради бога, не пиши себе для производства. Там уже есть надежные и эффективные хожиллионы.