Связанная хеш-таблица - это хеш-таблица, в которой хранится каждый элемент, который вы в нее поместили, даже если ключ для 2 элементов хеширует одно и то же значение или даже если 2 элемента имеют абсолютно одинаковый ключ.
Реализация DEFLATE должна хранить кучу элементов (ключ, данные) в произвольном порядке и быстро просматривать список всех элементов с этим ключом.В этом случае ключ представляет собой 3 последовательных байта несжатого открытого текста, а данные являются своего рода указателем или смещением, в котором эта 3-байтовая подстрока встречается в незашифрованном тексте.
Многие реализации хеш-таблицы / словаря хранят обаключ и данные для каждого элемента.Не обязательно хранить ключ в таблице для DEFLATE, но это не повредит ничему, кроме использования немного большего объема памяти во время сжатия.
Некоторые реализации хеш-таблиц / словарей, такие как C ++ STL unordered_map
, настаивают на том, чтокаждый элемент (ключ, данные), который они хранят, должен иметь уникальный ключ.Когда вы пытаетесь сохранить другой элемент (ключ, данные) с тем же ключом, что и некоторый более старый элемент, уже существующий в таблице, эти реализации удаляют старый элемент и заменяют его новым элементом.Это причиняет вред - если вы случайно используете C ++ STL unordered_map
или аналогичную реализацию, ваш сжатый файл будет больше, чем если бы вы использовали более подходящую библиотеку, такую как C ++ STL hash_multimap
.Подобную ошибку может быть трудно обнаружить, так как результирующие (излишне большие) сжатые файлы могут быть правильно распакованы любым стандартным компрессором DEFLATE в файл бит-за-битом, идентичный исходному файлу.Несколько реализаций DEFLATE и других алгоритмов сжатия намеренно используют такую реализацию, сознательно жертвуя размером сжатого файла, чтобы получить скорость сжатия.
Как сказал Ник Джонсон, хеш-функция по умолчанию, используемая в вашей стандартной «хеш-таблице» илиреализация словаря, вероятно, более чем адекватна.
http://en.wikipedia.org/wiki/Hashtable#Separate_chaining