Почему словари .Net меняются на простые числа? - PullRequest
14 голосов
/ 09 января 2011

Согласно этот вопрос словарь .Net изменяет свое выделенное пространство до простых чисел, которые как минимум вдвое превышают текущий размер. Почему важно использовать простые числа, а не просто вдвое больше текущего размера? (Я пытался использовать свои способности Google-фу, чтобы найти ответ, но безрезультатно)

Ответы [ 3 ]

15 голосов
/ 09 января 2011

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

Одним особенно приятным свойством этого является то, что для capacity > 30 вклад каждого бита в хеш-код отличается. Таким образом, если вариация хеша сконцентрирована всего в нескольких битах, это все равно приведет к хорошему распределению. Это объясняет, почему способности, которые являются степенями двух, плохи: они маскируют старшие биты. Набор чисел, отличающихся только старшими битами, не исключен.

Лично я думаю, что они плохо выбирают эту функцию. Он содержит дорогостоящую операцию по модулю, и если записи кратны основной емкости, его производительность падает. Но, похоже, этого достаточно для большинства приложений.

11 голосов
/ 09 января 2011

Это деталь реализации алгоритма, связанная с выбором хорошей хеш-функции и обеспечивающая равномерное распределение Неравномерное распределение увеличивает количество коллизий и стоимость их устранения.

5 голосов
/ 09 января 2011

Из-за математики простых чисел. Их нельзя разложить на разные меньшие числа. Когда вы разделяете хеш-число из сохраненных элементов, вы получаете равное распределение. Если у вас не будет простого числа, в зависимости от объектов, распределение может быть нечетным.

...