Есть две (слегка) ортогональные проблемы.
Хотя хэш-функция, очевидно, важна, в целом вы отделяете дизайн бэкенда от дизайна хеш-функции:
- хеш-функция зависит от данных, которые должны быть сохранены
- бэкэнд зависит от требований к хранилищу
Для хеш-функций я бы посоветовал прочитать о CityHash или MurmurHash (с объяснением для SO ).
Для серверной части, как вы заметили, существуют различные проблемы.Несколько замечаний:
- Мы говорим о средней или наихудшей сложности?Насколько мне известно, без идеального хеширования достижение O (1) практически невозможно, хотя частоту и сложность наихудшего случая можно значительно снизить.
- Мы говорим об амортизированной сложности?Амортизируемая сложность в целом обеспечивает лучшую пропускную способность за счет «шипов».Линейное перефразирование, за счет немного меньшей пропускной способности, даст вам более плавную кривую.
- Что касается многопоточности, обратите внимание, что шаблон чтения / записи может повлиять на решение, учитывая крайние случаи, 1 производительи 99 читателей сильно отличаются от 99 производителей и 1 читателя.В целом записи труднее распараллелить, потому что они могут потребовать изменения структуры.В худшем случае они могут потребовать сериализации.
- Сборка мусора довольно тривиальна в амортизированном случае, с линейной перефразировкой это немного сложнее, но, вероятно, наименее сложная часть.
Вы никогда не говорили о количестве данных, которые вы собираетесь использовать.Авторы могут обновлять различные сегменты, не мешая друг другу, поэтому, если у вас много данных, вы можете попытаться распространить их вокруг, чтобы избежать конфликтов.
Ссылки:
- The *В статье 1036 * в Википедии представлено множество различных реализаций, всегда приятно взглянуть на разнообразие
- В этом GoogleTalk от доктора Клиффа (Azul Systems) показана хеш-таблица, предназначенная для сильномногопоточные системы на Java.