ХЭШ
Добавлено: 04.03.2010 18:12:02
Привет, господа!
Получила сегодня крайне расплывчатое задание по программированию, нет возм-ти уточнить.
Насколько я поняла, мне надо реализовать "хэш-фцию" - простую, без ключей, даже без хэш-массива, тупо ф-цию отображения чисел. И состоять она должна где-то из 3-5 бинарных операций.
Гугл подсказал мне попробовать сдвигать в цикле каждые 8 битов 32-битового числа сначала, например, на три влево, потом на 5 вправо, и все это постоянно плюсовать к переменной, отвечающей за отображение. Я сейчас пишу, но совсем не уверена, что распределение будет такое ровное, как должно быть.
Вторая идея - просто брать от числа остаток по модулю - чем не хэш? Но это же не бинарная операция.
В общем, такой вопрос: кроме этих двух вариантов, вы знаете какие-ть простые (в 3-5 операций, причем бинарных) алгоритмы? Сроки поджимают, запуталась совсем.
Добавлено спустя 25 минут 53 секунды:
ОП, простите, уже нашла приличный
public int hash32shift(int key)
{
key = ~key + (key << 15); // key = (key << 15) - key - 1;
key = key ^ (key >>> 12);
key = key + (key << 2);
key = key ^ (key >>> 4);
key = key * 2057; // key = (key + (key << 3)) + (key << 11);
key = key ^ (key >>> 16);
return key;
}
Теперь буду переводить на паскаль.
В любом случае, простите и спаисбо
Получила сегодня крайне расплывчатое задание по программированию, нет возм-ти уточнить.
Насколько я поняла, мне надо реализовать "хэш-фцию" - простую, без ключей, даже без хэш-массива, тупо ф-цию отображения чисел. И состоять она должна где-то из 3-5 бинарных операций.
Гугл подсказал мне попробовать сдвигать в цикле каждые 8 битов 32-битового числа сначала, например, на три влево, потом на 5 вправо, и все это постоянно плюсовать к переменной, отвечающей за отображение. Я сейчас пишу, но совсем не уверена, что распределение будет такое ровное, как должно быть.
Вторая идея - просто брать от числа остаток по модулю - чем не хэш? Но это же не бинарная операция.
В общем, такой вопрос: кроме этих двух вариантов, вы знаете какие-ть простые (в 3-5 операций, причем бинарных) алгоритмы? Сроки поджимают, запуталась совсем.
Добавлено спустя 25 минут 53 секунды:
ОП, простите, уже нашла приличный
public int hash32shift(int key)
{
key = ~key + (key << 15); // key = (key << 15) - key - 1;
key = key ^ (key >>> 12);
key = key + (key << 2);
key = key ^ (key >>> 4);
key = key * 2057; // key = (key + (key << 3)) + (key << 11);
key = key ^ (key >>> 16);
return key;
}
Теперь буду переводить на паскаль.
В любом случае, простите и спаисбо