почему используется простое число в hash функцпии?
От: Аноним  
Дата: 12.01.11 23:20
Оценка:
Добрый день, вы не могли бы на пальцах объяснить почему в функции для нахождения hash, пример для String:


int hash = 0;
for (char ch : str.toCharArray()) {
hash = hash * 31 + ch;
}

нужно использовать простое число (31 в нашем случае)
точнее, я догадываюсь, что так как используется не операция нахождения остатка после деления hash на длину hash таблицы, а битовая маска. т.к. эта операция эффективнее
меня интересует именно, почему простое число должно использоваться.
с битами не оч. силен, если можно в примере покажите...
Re: почему используется простое число в hash функцпии?
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 13.01.11 08:54
Оценка: 8 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Добрый день, вы не могли бы на пальцах объяснить почему в функции для нахождения hash


http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re: почему используется простое число в hash функцпии?
От: MozgC США http://nightcoder.livejournal.com
Дата: 23.01.11 22:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день, вы не могли бы на пальцах объяснить почему в функции для нахождения hash, пример для String:

А>нужно использовать простое число (31 в нашем случае)

Почему для реализации GetHashCode так часто используют XOR?
Автор: MozgC
Дата: 04.08.10
Re: почему используется простое число в hash функцпии?
От: Lloyd Россия  
Дата: 23.01.11 23:09
Оценка: :)))
Здравствуйте, Аноним, Вы писали:

А>меня интересует именно, почему простое число должно использоваться.


Ну, дык, KISS-принцип: Keep It Simple S***** (Сохраняй Его Простым Д*****).
Re: почему используется простое число в hash функцпии?
От: MozgC США http://nightcoder.livejournal.com
Дата: 24.01.11 00:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день, вы не могли бы на пальцах объяснить почему в функции для нахождения hash, пример для String:

А>нужно использовать простое число (31 в нашем случае)

Я как-то интересовался данной темой, искал в разных книгах, в гугле и т.д. Мне показалось, что нет каких-то конкретных убедительных теорем, доказывающих, что использование простых чисел в хеш-функциях позволяет добиться лучших результатов (под лучшими результатами в хешировании понимается равная статистическая вероятность появления любого возможного результата хеш-функции, т.е. если хеш-фукнция допускает 100 различных значений от 1 до 100, то в идеале вероятность того, что результатом будет хеширования некоторого входного аргумента будет число 1 (или 2, или 100), должна быть равна 1%).
Тем не менее, на практике получается именно так, что использование простых чисел в хеш-функциях позволяет добиться лучших результатов.
В общем-то вот и все... Загадки математики
Re[2]: почему используется простое число в hash функцпии?
От: de Niro Ниоткуда  
Дата: 24.01.11 07:51
Оценка:
Здравствуйте, Lloyd, Вы писали:

А>>меня интересует именно, почему простое число должно использоваться.


L>Ну, дык, KISS-принцип: Keep It Simple S***** (Сохраняй Его Простым Д*****).


Простое число — prime number (а не simple)
Re[3]: почему используется простое число в hash функцпии?
От: Lloyd Россия  
Дата: 24.01.11 07:57
Оценка: :)
Здравствуйте, de Niro, Вы писали:

L>>Ну, дык, KISS-принцип: Keep It Simple S***** (Сохраняй Его Простым Д*****).


DN>Простое число — prime number (а не simple)


Ну какой же вы нуудный.
Re[2]: почему используется простое число в hash функцпии?
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 24.01.11 08:56
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Я как-то интересовался данной темой, искал в разных книгах, в гугле и т.д.


http://books.google.ru/books?id=GYgx_RaZ8fgC&amp;printsec=frontcover

там с матчастью все в порядке.

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[4]: почему используется простое число в hash функцпии?
От: de Niro Ниоткуда  
Дата: 24.01.11 16:18
Оценка:
Здравствуйте, Lloyd, Вы писали:

DN>>Простое число — prime number (а не simple)


L>Ну какой же вы нуудный.


Ну не все же хорошо знают английский. Кто-нибудь прочтет ваш перл и будет думать, что это правильный перевод.
Re[5]: почему используется простое число в hash функцпии?
От: Lloyd Россия  
Дата: 24.01.11 16:20
Оценка:
Здравствуйте, de Niro, Вы писали:

L>>Ну какой же вы нуудный.


DN>Ну не все же хорошо знают английский. Кто-нибудь прочтет ваш перл и будет думать, что это правильный перевод.


для таких специально поставлен смайлик.
Re: почему используется простое число в hash функцпии?
От: Zvorygin  
Дата: 25.01.11 15:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день, вы не могли бы на пальцах объяснить почему в функции для нахождения hash, пример для String:



А>int hash = 0;

А>for (char ch : str.toCharArray()) {
А> hash = hash * 31 + ch;
А>}

А>нужно использовать простое число (31 в нашем случае)

А>точнее, я догадываюсь, что так как используется не операция нахождения остатка после деления hash на длину hash таблицы, а битовая маска. т.к. эта операция эффективнее
А>меня интересует именно, почему простое число должно использоваться.
А>с битами не оч. силен, если можно в примере покажите...

Хеши должны обладать такой интересной особенностью, что для двух похожих структур, желательно давать различные результаты(чем более различные тем лучше).
Тогда на реальных, скорее всего упорядоченных данных(не очень рандомных) не будет коллизий.

При использовании в хеш-таблицах, хеши, как Вы правильно заметили обычно берутся по модулю длины хеш-таблицы.

Пусть в качестве множителя мы выбрали число K(в яве оно 31).

Теперь рассмотрим такой простой ряд строк — предложения русского языка с точкой в конце(пример немного надуман, но при желании его можно обобщить)

"[рандомная-часть строки].","[рандомная-часть строки].", "[рандомная-часть строки]."

Во всех строках последний символ одинаковый — ".", и есть некоторый различный префикс. Префикс всегды будет делиться на K.

Т.е. хеш код всех таких функций по модулю K будет одинаковым.

Будет много коллизий, если у K и у длины хеш-таблицы будет общий множитель.

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

Я это как-то так себе представляю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.