Задать вопрос
@tarelka95

Виртуальное хеширование?

Прошу помочь мне разобраться с алгоритмом работы виртуального хеширования. К сожалению, сколько не гуглил понятной информации по этой теме найти не смог. На русском языке вообще не удалось ничего найти. Есть документ на английском, но с помощью переводчика смысл его мне не удалось уловить. Прошу помочь мне разобраться или привести алгоритм на русском языке.
Так же ищу реализацию этого алгоритма на C/C++.
  • Вопрос задан
  • 2619 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Mrrl
@Mrrl
Заводчик кардиганов
Английский там простой. Даже чересчур простой (что не удивительно, учитывая, что это писали французы) - и в результате этого упрощения существенные детали скрылись или потерялись.
Общая идея понятна: мы вычисляем номер корзины при хешировании как K=C%N (где C - значение hash key), а когда корзина переполняется, увеличиваем для неё N в 2 раза, и перекидываем часть элементов (для которых C%(2*N)!=K) в корзину с номером K+N. У корзины как-то запоминаем актуальное для неё значение N=N0*2^j (точнее, запоминаем j).
Дьяволы, как обычно, прячутся в деталях, и эти детали при первом прочтении мне понять не удалось:
- до переполнения в корзине может храниться более одного элемента. Где они хранятся? Для них сразу зарезервировано место, или где-то есть место для хранения списка?
- Что они делают при увеличении N? Неужели удваивают размер всей таблицы? Или каким-то образом отводят место только для новых корзин - потомков переполнившихся?
Не знаю, какая у Вас цель, но я бы в этот момент придумал какую-нибудь схему, рещающую эти вопросы (вероятно, представил бы корзины в виде бинарного дерева, где пути влево-вправо определяются битами в последовательности остатков C%(N*2^j)), не пытаясь разобраться в статье дальше. Но если нужно разобраться именно в этом алгоритме - придётся его читать.
Кстати, какого года статья? По общему впечатлению (и по датам цитируемых работ), это где-то 1979-1985 гг. Не забывайте, что тогда "640 КБ хватало всем"!
Ответ написан
tsarevfs
@tsarevfs
C++ developer
Прочитайте про хеш таблицы на русском. Когда вы будете понимать о чем идет речь переводить будет проще.
Ответ написан
Комментировать
donkaban
@donkaban
Умею рисовать тени
Отличный способ разобраться - goo.gl/2q3nyK
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Я крайне сомневаюсь что вы сможете найти какую-либо информацию по этому способу хэширования на русском.

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

Войдите, чтобы написать ответ

Похожие вопросы