Сумасшедшее хеширование в C

вам следует посетить http://www.myApplication.com/pax-arten/index , как сказал SiZE

16
задан Remo.D 23 October 2008 в 21:29
поделиться

8 ответов

5
ответ дан 30 November 2019 в 21:37
поделиться

Как указывали другие ответы, верно, что самый простой хеш-таблица кукушки требует, чтобы таблица была наполовину пустой. Тем не менее, концепция была обобщена на d - хэширование с кукушкой, в котором каждый ключ имеет d возможных мест для гнезда, в отличие от 2 мест в простой версии.

Приемлемый коэффициент нагрузки быстро увеличивается при увеличении d . Только для d = 3 вы уже можете использовать около 75% полной таблицы. Недостатком является то, что вам нужны d независимые хеш-функции. Я фанат хеш-функций Боба Дженкинса для этой цели (см. http://burtleburtle.net/bob/c/lookup3.c ), которые могут оказаться полезными в реализации хеширования кукушки.

7
ответ дан 30 November 2019 в 21:37
поделиться

Язык IO имеет один в PHash.c. Можно найти эти код для IO на GitHub. IO является лицензируемым BSD.

1
ответ дан 30 November 2019 в 21:37
поделиться

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

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

Для двоичного дерева я имел бы:

struct node {
  void *key;
  void *value;
  struct node *left;
  struct node *right;
}

Так, принимающие указатели имеют весь одинаковый размер s, для хранения n объекты, в которых я буду нуждаться 4 с байты.

Skiplists являются почти тем же, поскольку среднее количество указателей в узле равняется 2.

В хеш-таблице я имел бы:

struct slot {
  void *key;
  void *value;
}

Так, каждый объект будет только requre 2 с байты, которые будут сохранены. Если коэффициент загрузки составит 50%, для хранения n объекты, то мне будет нужно тот же 4 с байты как деревья.

Это не кажется слишком плохим мне: сумасшедшая хеш-таблица займет более или менее тот же объем памяти как двоичное дерево, но даст мне O (1) время доступа, а не O (зарегистрируйте n).

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

Другие схемы хеширования могли достигнуть лучшего коэффициента загрузки (скажите, что 75% или 80%) без гарантии на времени выборки для наихудшего случая (который мог даже быть O (n)).

Между прочим, d-ary кукушка, хеширующая и" сумасшедшее хеширование с притоном ", кажется, могут увеличить коэффициент загрузки при тихом хранении постоянного времени доступа.

Сумасшедшее хеширование кажется ценной техникой мне, и я думал, что оно было уже исследовано; это - причина моего вопроса.

1
ответ дан 30 November 2019 в 21:37
поделиться

Сумасшедшее хеширование относительно не использовано за пределами академии (кроме аппаратных кэшей, которые иногда одалживают идеи у, но действительно не реализуют полностью). Это требует, чтобы очень редкая хеш-таблица получила хорошее время на вставках - у Вас действительно должен быть 51% Вашей таблицы, пустой для хорошей производительности. Таким образом, это - или быстро и занимает много места, или медленный и использует пространство эффективно - никогда оба. Другие алгоритмы являются оба эффективным временем и пространством, хотя они хуже, чем кукушка, когда только время или пространство приняты во внимание.

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

-Adam

6
ответ дан 30 November 2019 в 21:37
поделиться

После комментария от "onebyone" я реализовал и протестировал несколько версий Сумасшедшего хеширования для определения требования реальной памяти.

После некоторого эксперимента, заявление, что Вы не имеете к reash до таблицы, почти на 50% полно, кажется, верен, особенно если" притон " прием является implmented.

проблема состоит в том при увеличении таблицы. Обычный подход должен удвоить свой размер, но это приводит к новой таблице, являющейся используемыми только 25%!

На самом деле, предположите, что хеш-таблица имеет 16 слотов, когда я вставлю 8-е число элемента, я выбегу из хороших слотов и буду иметь к reash. Я удвою его, и теперь таблица является 32 слотами с только 8 из них занятый, который является 75%-ми отходами!

Это - цена для оплаты, чтобы иметь "постоянное" время поиска (с точки зрения верхней границы для количества доступа/сравнения).

я разработал другую схему, хотя: запуск с питания 2 больших, чем 1, если таблица имеет n слоты и n, является питанием два, добавьте, что n/2 слоты иначе добавляют n/3 слоты:

+--+--+
|  |  |                             2 slots
+--+--+

+--+--+--+
|  |  |  |                          3 slots
+--+--+--+ 

+--+--+--+--+
|  |  |  |  |                       4 slots
+--+--+--+--+

+--+--+--+--+--+--+
|  |  |  |  |  |  |                 6 slots
+--+--+--+--+--+--+

+--+--+--+--+--+--+--+--+
|  |  |  |  |  |  |  |  |           8 slots
+--+--+--+--+--+--+--+--+

и т.д.

Вместе с предположением, что переозоление только произойдет, когда таблица будет на 50% полна, это приводит к тому, что таблица только составит 66%, пустых (1/3-й), а не 75%, пустых (1/4-й) после reash (т.е. худший случай).

я также выяснил (но я все еще должен проверить математику), что, увеличиваясь каждый раз sqrt (n), потраченное впустую пространство асимптотически приближается к 50%.

, Конечно, цена для оплаты за меньшее количество потребления памяти является увеличением количества reash, который будет необходим в конце. Увы, ничто не прибывает бесплатно.

я собираюсь заняться расследованиями далее, если кому-либо интересно.

1
ответ дан 30 November 2019 в 21:37
поделиться

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

Хотя вставка теоретически может быть неограниченной, на практике она может быть ограничена до O (log n) количества строк в таблице (ах) и при измерении время вставки в среднем составляет около 1,1 * дня доступа к памяти. Это всего на 10% больше абсолютного минимума! Доступ к памяти часто является ограничивающим фактором в сетевом оборудовании.

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

1
ответ дан 30 November 2019 в 21:37
поделиться

Несмотря на то, что это старый вопрос, кому-то все еще может быть интересно :)

В этой статье описывается реализация параллельного хеширования с кукушкой на графических процессорах (CUDA / OpenCL) . Он очень хорошо описан, и реализовать его на основе описания довольно просто. Вообще стоит прочитать, если вам интересна эта тема. (Однако вам понадобится вход в ACM.)

3
ответ дан 30 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

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