Ведро, в которое помещается элемент, определяется (hash & 0x7FFFFFF) % capacity
. Это должно быть равномерно распределено. Из этого следует, что если несколько записей, кратных определенной базе (hash1 = x1 * base
, hash2 = x2 * base
, ...), где base
и capacity
не взаимно просты (наибольший общий делитель> 1), то некоторые слоты чрезмерно используются, а некоторые никогда не используются. Поскольку простые числа взаимно просты с любым числом, кроме самих себя, они имеют относительно хорошие шансы на получение хорошего распределения.
Одним особенно приятным свойством этого является то, что для capacity > 30
вклад каждого бита в хеш-код отличается. Таким образом, если вариация хеша сконцентрирована всего в нескольких битах, это все равно приведет к хорошему распределению. Это объясняет, почему способности, которые являются степенями двух, плохи: они маскируют старшие биты. Набор чисел, отличающихся только старшими битами, не исключен.
Лично я думаю, что они плохо выбирают эту функцию. Он содержит дорогостоящую операцию по модулю, и если записи кратны основной емкости, его производительность падает. Но, похоже, этого достаточно для большинства приложений.