2015-05-13 2 views
1

Мне нужна функция хэша, которая настолько эффективна, насколько это возможно, для хэш-таблицы (фактически хэш-набора), которая использует зондирование (открытую адресацию) для разрешения конфликтов. Записями, хранящимися в таблице, являются все 4 байтовые int, которые принимают случайные значения в диапазоне.Является ли mod prime достаточно хорошим как хеш-функция для хэш-таблицы в C

Я рассматриваю что-то даже быстрее, чем djb2, что-то вроде

value mod LARGE_PRIME 

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

Мне не нужны криптографические аспекты хеш-функции - до тех пор, пока она не ужасно подвержена столкновениям, она должна работать нормально.

Будет ли это делать хэш-функцию? Могу ли я определить конкретный алгоритм для моей емкости хэш-таблицы каждый раз, когда я изменяю размер, чтобы улучшить его?

+3

Что вы подразумеваете под 'LARGE_PRIME'? 'value mod LARGE_PRIME' является' значением' для всех значений, меньших, чем 'LARGE_PRIME'. –

+0

Хороший вопрос. Я считаю, что моя таблица не должна превышать 256 записей, поэтому я предполагаю, что примерно 1000. Вопрос отредактирован. –

+0

«принимать на случайные значения» - это «случайный» означает, что вам не нужны хэширование или простые числа, и ваш «как можно более эффективный» может быть или не быть достаточно строгим, чтобы вы могли заботиться, а просто побитовое - и может маскировать более крупное случайное значение в счетчике 2-го уровня мощности более эффективно, чем операция мод (когда количество ведра неизвестно до времени выполнения). –

ответ

3

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

value MOD number_of_buckets 

будет разумной хэш-функции - добавление в MOD <prime> не будет на самом деле дать вам очень много, и на самом деле может привести к ухудшению хэширования (потому что некоторые ведра будут недо- или чрезмерно использованы больше, чем в противном случае).

Простые не магические - их иногда можно использовать для «сглаживания» эффектов корреляции из-за общих факторов, но если у вас нет этих корреляций для начала, вам может быть лучше без них, особенно если скорость имеет первостепенное значение!

+0

Хмм хорошая точка! Наверное, меня немного беспокоило, как использование 2^n количества ведер может сделать его более подверженным столкновению. Я вижу, что сейчас это не имеет значения, если мой ввод действительно случайный! –