Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2013, 23:06   #1
Fonduee
 
Регистрация: 06.10.2010
Сообщений: 5
По умолчанию Хэш Функция с параметром "Void"

Всем привет,

у меня такой вопрос, нужно написать хэш-функцию по прототипу

Код:
unsigned long hash(const void * value);
Так как параметр поинтер типа "void", передаваться могут и цифры и строки и пр., а значит нужен совершенно разный к ним подход или возможно есть универсальное решение?
Fonduee вне форума Ответить с цитированием
Старый 12.11.2013, 23:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А какого рода функция? Как именно она вычисляет хеш? Если побайтно то по барабану - просто обращайся к значению через указатель value и все.
Примерно так, если не ошибаюсь:
Код:
(char*)(value+<номер байта>)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.11.2013, 00:31   #3
Fonduee
 
Регистрация: 06.10.2010
Сообщений: 5
По умолчанию

Спасибо,

Код:
unsigned long hash(const void * value) {
    unsigned long hash = 49613;
    int c;
    while ((c = *(char *) value++)) {
        hash = ((hash << 5) + hash) + c;
    }
    return hash;
}
Вроде работает.
Fonduee вне форума Ответить с цитированием
Старый 13.11.2013, 09:08   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Не, не работает...
Например сравните хэш от таких вызовов:
int var = 1;
hash(&var);
var = 2;
hash(&var);
var = 3;
hash(&var);

добавьте аргумент - количество байт, на которые указывает void* и обрабатывайте все байты, а не только до первого нуля.
waleri вне форума Ответить с цитированием
Старый 13.11.2013, 11:51   #5
Fonduee
 
Регистрация: 06.10.2010
Сообщений: 5
По умолчанию

Эммм, хеш ведь разный, как и нужно.

Код:
    int var = 1;
    printf("hash(%d)=%lu\n", var, hash(&var));
    var = 2;
    hash(&var);
    printf("hash(%d)=%lu\n", var, hash(&var));
    var = 3;
    hash(&var);
    printf("hash(%d)=%lu\n", var, hash(&var));
Код:
hash(1) = 1637230
hash(2) = 1637231
hash(3) = 1637232
Fonduee вне форума Ответить с цитированием
Старый 13.11.2013, 12:06   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Аx, ну да, надо старший байт менять...
var = 0x100
var = 0x200
var = 0x300
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
expexted primary expression before "void" Юлькo Помощь студентам 1 13.06.2010 22:05
Ошибка "void value not ignored as it ought to be" Парсифаль Общие вопросы C/C++ 4 02.02.2010 03:22
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Создание столбца "с параметром" в SQL andirock2112 БД в Delphi 4 26.04.2009 05:55