|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 30, 2004 01:13:32 · Поправил: volodya Мне надо соорудить нечто, что будет напоминать хеш-таблицу с коллизиями. Сначала думал сформировать прототип хеш-мэпа в виде пары <char *, int>. А теперь смотрите какую он использует хеш-функцию:
inline size_t hash_value(const char *_Str)
{
...
for(_Strsize _Idx = 0; _Idx <= _Size; _Idx += _Stride)
_Val += (size_t)_Str[_Idx];
}
КРИВОРУКИЕ УРОДЫ! ЭТО Ж КОЛИЧЕСТВО КОЛЛИЗИЙ И ПРИДУМАТЬ ТАКОЕ СЛОЖНО!!! Тогда возникает вопрос. У меня есть четыре целых и одна строка переменной длины. Как мне на основе этого сформировать хеш? Два условия: минимизировать коллизии и максимизировать скорость. У кого-нибудь предложения есть? P.S. С hash_multimap кто-нибудь работал? Или примерчик на посмотреть даст? |
|
|
Дата: Мар 30, 2004 01:41:23 Примерчики уже нашел. Дундук. В MSDN 8-) Остается лишь вопрос по хеш-функции. |
|
|
Дата: Мар 30, 2004 02:06:01 Ну возьми великий и могучий ELF hash |
|
|
Дата: Мар 30, 2004 07:01:38 · Поправил: volodya Вот чего надыбал:
#include "GeneralHashFunctions.h"
unsigned int RSHash(string str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;
for(unsigned int i = 0; i < str.length(); i++)
{
hash = hash*a+str[i];
a = a*b;
}
return (hash & 0x7FFFFFFF);
};
/* End Of RS Hash Function */
unsigned int JSHash(string str)
{
unsigned int hash = 1315423911;
for(unsigned int i = 0; i < str.length(); i++)
{
hash ^= ((hash << 5) + str[i] + (hash >> 2));
}
return (hash & 0x7FFFFFFF);
};
/* End Of JS Hash Function */
unsigned int PJWHash(string str)
{
unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
unsigned int ThreeQuarters = (unsigned int)((BitsInUnignedInt * 3) / 4);
unsigned int OneEighth = (unsigned int)(BitsInUnignedInt / 8);
unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);
unsigned int hash = 0;
unsigned int test = 0;
for(unsigned int i = 0; i < str.length(); i++)
{
hash = (hash << OneEighth) + str[i];
if((test = hash & HighBits) != 0)
{
hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
}
return (hash & 0x7FFFFFFF);
};
/* End Of P. J. Weinberger Hash Function */
unsigned int ELFHash(string str)
{
unsigned int hash = 0;
unsigned int x = 0;
for(unsigned int i = 0; i < str.length(); i++)
{
hash = (hash << 4) + str[i];
if((x = hash & 0xF0000000L) != 0)
{
hash ^= (x >> 24);
hash &= ~x;
}
}
return (hash & 0x7FFFFFFF);
};
/* End Of ELF Hash Function */
unsigned int BKDRHash(string str)
{
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
unsigned int hash = 0;
for(unsigned int i = 0; i < str.length(); i++)
{
hash = (hash*seed)+str[i];
}
return (hash & 0x7FFFFFFF);
};
/* End Of BKDR Hash Function */
unsigned int SDBMHash(string str)
{
unsigned int hash = 0;
for(unsigned int i = 0; i < str.length(); i++)
{
hash = str[i] + (hash << 6) + (hash << 16) - hash;
}
return (hash & 0x7FFFFFFF);
};
/* End Of SDBM Hash Function */
unsigned int DJBHash(string str)
{
unsigned int hash = 5381;
for(unsigned int i = 0; i < str.length(); i++)
{
hash = ((hash << 5) + hash) + str[i];
}
return (hash & 0x7FFFFFFF);
}
/* End Of DJB Hash Function */
|
|
|
Дата: Июн 15, 2004 19:13:06 Гы, нашел, наконец-то RFC по MD5, а то все никак найти не мог... ftp://ftp.rfc-editor.org/in-notes/rfc1321.txt |
|
|
Дата: Июн 15, 2004 19:20:06 |
|
|
Дата: Июн 15, 2004 19:53:24 volodya нуу ваще-то MD5 он немаленький (там толи 128 толи 160 бит), относительно медленный, но дает минимум коллизий (ес-но при такой-то длине) вопрос сильно зависит от контекста - что за дворды у тебя используются, что за строки... напр, если твои дворды это VA, то можно использовать даже младший байт - уже получишь хорошую минимизацию коллизий. старший байт (word) использовать не стоит вообще, т.к. коллизий будет очень много. короче, все это очень относительно... з.ы. я проверял как-то CRC32 на именах функций из всех dll, найденных у меня на машине (а установленно у меня оочень много), так вот, была (кажется) пара функций, дающих коллизию. Так что MD5, это, имхо, лишнее... |
|
|
Дата: Июн 15, 2004 20:19:19 Да я уже не о своем случае, здесь я и ELFHash с лихвой обойдусь. От добра добра не ищут. Я не настолько помешанный на алгоритмах, чтобы где надо и где не надо их использовать :) |
|
|
Дата: Июн 15, 2004 20:33:08 · Поправил: Shift можно попробовать md4 - вроде как побыстрей md5 будет |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088 |