ХЭШ

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

ХЭШ

Сообщение 0minus273 » 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;
}

Теперь буду переводить на паскаль.
В любом случае, простите и спаисбо
Аватара пользователя
0minus273
незнакомец
 
Сообщения: 5
Зарегистрирован: 04.03.2010 17:59:29
Откуда: СПб

Re: ХЭШ

Сообщение Sergei I. Gorelkin » 04.03.2010 19:07:16

Вот тут используется нечто похожее.
Я так догадываюсь, что основная проблема - это не сама ф-ция, а набор тестов, показывающих, что она адекватно себя ведет.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: ХЭШ

Сообщение скалогрыз » 04.03.2010 19:40:51

0minus273 писал(а):Теперь буду переводить на паскаль.
В любом случае, простите и спаисбо


с наступающим!

Код: Выделить всё
function hash32shift(key: Integer): Integer;
begin
  key := not key + (key shl 15);
  key := key xor (key shr 12);
  key := key + (key shl 2);
  key := key xor (key shr 4);
  key := key * 2057;
  key := key xor (key shr 16);
  hash32shift:=key;
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

Рейтинг@Mail.ru