Хорошее правило большого пальца (не всегда идеальное, ну просто правило большого пальца) - это повторное хэширование, если хэш-таблица заполнена до 80%. Это означает, что если у вас есть 100 ведер и 80 предметов внутри, независимо от того, сколько у вас было столкновений, у вас будет время увеличить вместимость.
Насколько вы должны его увеличить? Ну, нет также идеальной стоимости. Самое простое решение - удвоить мощность при каждом увеличении. То есть до 200, 400, 800 и так далее. Если вы думаете, что это слишком много (в конце концов, при увеличении размера хеш-таблицы, когда вы действительно увеличите размер хэш-таблицы, и вы, возможно, никогда не заполните все 16 МБ), вы увеличите коэффициент увеличения. По крайней мере, 1/3 рекомендуется (с 100 до 133), я бы сказал, возможно, пусть это будет расти на 50% каждый раз в качестве компромисса.
Обратите внимание, что все это также зависит от того, как обрабатываются коллизии. Простой способ справиться с ними (мой личный фаворит) - хранить элементы в связанном списке при столкновении. Если на один и тот же ключ положено 3 предмета, для его поиска остается только до 3 сравнений. Так как связанный список очень неэффективен для поиска, вы можете увеличить емкость раньше, например, если 60% емкости используется для быстрого сохранения хеш-таблицы. OTOH, вы можете сделать что-то более сложное и вести статистику о количестве столкновений. Пока у вас почти нет коллизий (если у вас очень хорошая хеш-функция), вам вообще не нужно повторно хэшировать, даже если используется 99% его емкости. Также, если вы обрабатываете коллизии изощренным способом (например, каждый узел снова является отсортированной таблицей, и вы можете выполнять двоичный поиск по ним), ваш поиск все еще может быть достаточно быстрым, если таблица загружена на 200% (таким образом, у вас в два раза больше элементов как емкость). В этом случае вы можете сохранить статистику о том, насколько велика самая крупная отсортированная таблица, и когда она становится больше, скажем, 8 записей, вы думаете, что она становится слишком медленной, и затем вы повторно хэшируете.
Повторное хеширование очень медленное, поэтому его следует избегать как можно чаще. Таким образом, если вам нужно повторно хэшировать, не просто слишком мало наращивайте емкость, в противном случае вам придется снова очень быстро хэшировать при добавлении большего количества элементов. Поэтому, когда вам нужно повторно хэшировать, сделать емкость значительно больше, чем количество элементов в таблице, все остальное слишком мало.