Возьмём простое число P. На него без остатка делится N чисел из диапазона значений Int32.
Возьмём число P+1. На него без остатка будут делится N' чисел из того же диапазона, причём N' <= N.
Компенсировать плохую работу хэш-функции можно не тем фактом, что число простое, а тем фактом, что число большое. Чем больше число, тем меньше других чисел на него нацело делится. В том контексте, о котором вы говорите, абсолютно не имеет значения, простое ли значение capacity, или нет.
Не сходится это с тем, что вы написали.
Вообще, если хэш равномерно распределён по всему диапазону своих возможных значений, то уже на что его не дели, всё равно остаток будет распределён равномерно в диапазоне значений [0; capacity). Общие делители на это абсолютно никак не влияют — влияет только распределение хэшей.
А, кажется, я начинаю понимать. Но думаю, что дело не в том, что какие-то биты «не работают». Ведь биты — всего лишь одно из бесонечности возможных представлений числа. Если представить то же самое число в троичной системе, то «не будут работать» биты при делении на 3. Если представить число в системе по основанию 59, то не будут работать биты при делении на 59.
Думаю, идея в оптимизации перехэширования. Ведь алгоритмы хеширования, хотя и могут быть основаны на разных принципах, наверное могут иногда вести себя схожим образом при, например, делении их хэщей на степень двойки, или тройки, или ещё какого-то числа. В общем, мне кажется, что простые числа нужны, чтобы свести к минимуму необходимость повторного перехеширования. Например, по какому-то конкретному хэшу накопилось 100 значений, а после смены хэш-алгоритма снова наблюдается та же ситуация из-за того, что в обоих алгоритмах «не работают биты» при взятии остатка деления на какое-то число. Так вот, чем больше размер массива buckets, тем меньше вероятность, что мы с этим стокнёмся — ведь простые числа растут, и всё меньше остаётся чисел, которые на них без остатка делятся.
При добавлении элемента вычисляется хэшкод его ключа и затем — индекс корзины в которую он будет добавлен по модулю от величины коллекции (именно для этого размер выбирается простым числом, чтобы обеспечить более равномерное распределение и уменьшить число возможных коллизий):
Я, наверное, что-то недопонял. Можете пояснить, как деление по модулю простого числа обеспечивает «более равномерное» распределение, чем деление по модулю обычного числа (например, на единицу большего, чем простое)?
Кстати, hashcode & 0x7fffffff — интересный приём. 0x7fffffff — это значение int.MaxValue.
Делается эта операция для того, чтобы транслировать отрицательную часть диапазона Int32 в положительную. Логически это то же самое, что:
I was told by a professor of mine that you didn’t have much control over your intelligence
мой преподаватель сказал мне, что я практически не контролирую свой интеллект
Не «я практически не контроллирую свой интеллект», а «людям плохо удаётся контроллировать свой интеллект». В вашем переводе кажется, что преподаватель говорил конкретно об авторе статьи.
The take-home points from this research?
Какие пункты этого исследования можно выполнять дома?
«Take-home points» — это выражение, означающее: «Что из этого можно для себя извлечь».
Извините, сообщение случайно отправилось раньше времени. Если будет время, я позже продложу.
Ну, хакеру, который запостил что-то на стену Цукерберга через уязвимость, так и не заплатили, хотя в предыдущие полгода он несколько раз писал отчёт об этой уязвимости в их службу поддержки.
50 000 DKK минус 39% = 30 500 DKK ~= $5450 после налогов на руки.
За $1800 в месяц можно снять отличную 3- или даже 4-комнатную квартиру, после этого остаётся 3650 долларов. Жить можно.
К вопросу о «прокормить и одеть семью» — в европейских семьях принято работать обоим супругам. Брать ипотеку, когда работает только один, в любом случае очень рискованно.
Вы неправильно поняли. При ударении на второй слог, слово обретает другой смысл — «участвовать в процессии». И там не ударение британское, а само слово, которое в этом значении в американском английском не употребляется.
В том значении, в котором слово употреблено в коде («обрабатывать»), есть только один вариант произношения — с ударением на первый слог. В том, что вы об этом не подозревали, нет ничего удивительного — это распространенная ошибка у русскоговорящих.
Возьмём число P+1. На него без остатка будут делится N' чисел из того же диапазона, причём N' <= N.
Компенсировать плохую работу хэш-функции можно не тем фактом, что число простое, а тем фактом, что число большое. Чем больше число, тем меньше других чисел на него нацело делится. В том контексте, о котором вы говорите, абсолютно не имеет значения, простое ли значение capacity, или нет.
Не сходится это с тем, что вы написали.
Вообще, если хэш равномерно распределён по всему диапазону своих возможных значений, то уже на что его не дели, всё равно остаток будет распределён равномерно в диапазоне значений [0; capacity). Общие делители на это абсолютно никак не влияют — влияет только распределение хэшей.
Думаю, идея в оптимизации перехэширования. Ведь алгоритмы хеширования, хотя и могут быть основаны на разных принципах, наверное могут иногда вести себя схожим образом при, например, делении их хэщей на степень двойки, или тройки, или ещё какого-то числа. В общем, мне кажется, что простые числа нужны, чтобы свести к минимуму необходимость повторного перехеширования. Например, по какому-то конкретному хэшу накопилось 100 значений, а после смены хэш-алгоритма снова наблюдается та же ситуация из-за того, что в обоих алгоритмах «не работают биты» при взятии остатка деления на какое-то число. Так вот, чем больше размер массива
buckets
, тем меньше вероятность, что мы с этим стокнёмся — ведь простые числа растут, и всё меньше остаётся чисел, которые на них без остатка делятся.hashcode & 0x7fffffff
— интересный приём.0x7fffffff
— это значениеint.MaxValue
.Делается эта операция для того, чтобы транслировать отрицательную часть диапазона
Int32
в положительную. Логически это то же самое, что:Не «я практически не контроллирую свой интеллект», а «людям плохо удаётся контроллировать свой интеллект». В вашем переводе кажется, что преподаватель говорил конкретно об авторе статьи.
«Take-home points» — это выражение, означающее: «Что из этого можно для себя извлечь».
Извините, сообщение случайно отправилось раньше времени. Если будет время, я позже продложу.
За $1800 в месяц можно снять отличную 3- или даже 4-комнатную квартиру, после этого остаётся 3650 долларов. Жить можно.
К вопросу о «прокормить и одеть семью» — в европейских семьях принято работать обоим супругам. Брать ипотеку, когда работает только один, в любом случае очень рискованно.
А вообще, для тех, кто выше спрашивал про экзамены, для получения визы ничего такого не требуется. Главное, чтобы твой работодатель был glæde :)
www.nyidanmark.dk/en-us/coming_to_dk/work/positivelist/positive_list_overview.htm
Какие будут ваши доказательства? :-)
В том значении, в котором слово употреблено в коде («обрабатывать»), есть только один вариант произношения — с ударением на первый слог. В том, что вы об этом не подозревали, нет ничего удивительного — это распространенная ошибка у русскоговорящих.