Подтвердить что ты не робот

Почему. Онлайн-словари изменяются до простых чисел?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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