0r@ngE
Опускаясь до хамства в адрес участников форума, тем более таких уважаемых как cNoNim, который вам всё вежливо и интеллигентно разжевал
и на пальцах объяснил, вы лишь показываете свою заниженную самооценку и ярко выраженную некомпетентность в данном вопросе.
Вот, специально для вас сделал выжимку основной идеи, на случай если вас в гугле забанили и(или) ссылки выше не открываются:
Если хеши ключей совпадают, то не факт что совпадают сами ключи, следовательно, для того чтобы убедиться что нет коллизии, нужно сравнивать ключи,
либо использовать "идеальный хеш", который не даёт коллизий, так как позволяет получить 100% уникальный хеш для любого допустимого ключа.
И на всякий случай на вашем родном языке:
Якщо хеши ключів збігаються, то не факт що збігаються самі ключі, отже, для того щоб переконатися що немає колізії, потрібно порівнювати ключі,
або використовувати "ідеальний хеш", який не дає колізій, оскільки дозволяє отримати 100% унікальний хеш для будь-якого допустимого ключа.
0r@ngE
> а в итоге пшик...
вы прощу прощения просто немного туговаты, вам нужна не хеш функция, а использовать вместо ключа для unordered_map, то что имеет смысл использовать, например саму строку, или пишете кроссплатформенный аналог type_index по аналогии с тем функционалом который уже реализован
при этом используете ту оптимизацию со статическим хешем, если уж в эту киллер фичу уперается профайлер, в случае коллизии хеша, делаете полное сравнение строки, при передачи по сети передаете и хеш, и строку, если хочется сэкономить на спичках, думаете о оптимизациях, а не так как сейчас,
взяли изначально бредовую концепцию и пытаемся доказать всем, что за семь лет ни единого разрыва
Прошу прощения джентельмены, отсутствовал по семейным обстоятельствам.
Я так понимаю что дальнейший дискус не имеет смысла ув cNoNim, ибо вы в корне не понимаете суть оного.
cNoNim
> вам нужна не хеш функция, а использовать вместо ключа для unordered_map, то
> что имеет смысл использовать, например саму строку
Сравнение строк - немного затратная операция, вам так не кажется? А вот size_t == size_t это очень быстро. При использовании своей хеш-функции получим стабильный кросплатформенный вариант.
type_index - это просто обертка над type_info, что в свою очередь просто обертка над строкой-именем типа.
Вот реализация операторов сравнения для MSVCPRT:
bool type_info::operator==(const type_info& rhs) const { return ( strcmp( ( rhs._M_d_name)+1, ( _M_d_name)+1)?0:1); } bool type_info::operator!=( const type_info& rhs) const { return ( strcmp( ( rhs._M_d_name)+1, ( _M_d_name)+1)?1:0); } bool type_info::before( const type_info& rhs) const { return ( strcmp( ( rhs._M_d_name)+1,( _M_d_name)+1) > 0); }
Но, как я писал выше - мне лично не удобно работать со строками (много времени уходит на сравнение их, много места занимают в памяти, больше данных слать по сети).
Поэтому я работаю с хешем от данной строки. И в 100500-й раз повторяю - я в курсе что хеши не идеальны, но а что делать, жизнь такая ;)
ЗЫ. Ну и на закуску - вот хеш-функция в Lua 5.3, которую Lua использует как ключ во всех своих таблицах. И ничего - живет и не чихает, а количество проектов использующих Lua можете сами проверить ;)
unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) { unsigned int h = seed ^ cast( unsigned int, l); size_t step = ( l >> LUAI_HASHLIMIT) + 1; for ( ; l >= step; l -= step) h ^= ( ( h<<5) + ( h>>2) + cast_byte( str[l - 1])); return h; }
Вот так идет выборка из таблицы:
Node *n = mainposition(t, key);
Вот реализация mainposition
static Node *mainposition (const Table *t, const TValue *key) { switch ( ttype( key)) { .......... case LUA_TSHRSTR: return hashstr( t, tsvalue( key)); } }
А ведь эти все люди то и не знают что есть вы, а то вы бы их тоже жизни научили!
ЗЫЫ. И очень вас прошу, угомоните свою ручную собачку Hybernaculum которая постоянно подгавкивает вам в такт.
Влом читать статью и срач.
Однажды в адовом угаре запилил такое:
https://github.com/Hardcode84/message-poc-poc-poc
0r@ngE
чувак без обид, но на твои сливы отвечать нет желания
https://github.com/lua/lua/blob/ef91579f913d6e1c4666d10b3dc08e1da… ltable.c#L161
static unsigned int findindex (lua_State *L, Table *t, StkId key) {
unsigned int i;
if (ttisnil(key)) return 0; /* first iteration */
i = arrayindex(key);
if (i != 0 && i <= t->sizearray) /* is 'key' inside array part? */
return i; /* yes; that's the index */
else {
int nx;
Node *n = mainposition(t, key);
for (;;) { /* check whether 'key' is somewhere in the chain */
/* key may be dead already, but it is ok to use it in 'next' */
if (luaV_rawequalobj(gkey(n), key) ||
(ttisdeadkey(gkey(n)) && iscollectable(key) &&
deadvalue(gkey(n)) == gcvalue(key))) {
i = cast_int(n - gnode(t, 0)); /* key index in hash table */
/* hash elements are numbered after array ones */
return (i + 1) + t->sizearray;
}
nx = gnext(n);
if (nx == 0)
luaG_runerror(L, "invalid key to 'next'"); /* key not found */
else n += nx;
}
}
}
мне честно влом объяснять тебе что такое mainposition
cNoNim
> мне честно влом объяснять тебе что такое mainposition
Объясни мне, пожалуйста ...
innuendo
А ты вроде читать умеешь, чего тебе непонятно в комментах в коде?
получается, здесь неправильно, т.к. нет сравнения строк:
https://github.com/bkaradzic/bgfx/blob/master/examples/common/ent… d.cpp#L54-L60
struct Func { ConsoleFn m_fn; void* m_userData; }; typedef stl::unordered_map<uint32_t, Func> CmdLookup; CmdLookup m_lookup; void CmdContext::exec(const char* _cmd) { /*_*/ uint32_t cmd = bx::hashMurmur2A( argv[0], ( uint32_t)strlen( argv[0]) ); CmdLookup::iterator it = m_lookup.find( cmd); if ( it != m_lookup.end( ) ) { Func& fn = it->second; err = fn.m_fn( this, fn.m_userData, argc, argv); }
PVSector
А ты думал один тс может неправильно использовать unordered_map?
cNoNim
> чувак без обид, но на твои [b]сливы[/b] отвечать нет желания
Да какие обиды, я в следующий раз запощу яблоки, ну или персики ;)
innuendo
> Объясни мне, пожалуйста ...
Возвращает указатель на начало хеш-списка.
cNoNim
Мне уже надоело спорить с бараном, используйте что хотите. Т.к. все имена ивентов известны еще на этапе компиляции, можно добавить проверку на колизии в компил-тайм для особо параноидальных (хотя оно при первом же запуске тоже матюкнется), и если вам повезет словить ту сотую долю процента - то дело решится простой переименовкой проблемного ивента. К чему вся эта ваша истерия я до сих пор в толк не возьму.
0r@ngE
карл ) нет ни какой истерии, я уже сказал, что можно съехать с темы...
в #92 еще были вопросы кажется, есть что по ним сказать? )
а вообще это меня ведь, даже не удивило...
> А ведь эти все люди то и не знают что есть вы, а то вы бы их тоже жизни научили!
> Мне уже надоело спорить с бараном
лол )
> Вот так идет выборка из таблицы:
> Возвращает указатель на начало хеш-списка.
вот это поворот
А ведь я предлагал сделать на прослушивателе :)
Ветхозаветная история. И понял Дейкстра, что, используя обвешанные логическими предикатами инструкции, можно, в некоторой степени, судить о правильности программы. И была одной из инструкций конструкция цикла.
Новый завет. И придумали структурные быдлокодеры "матрешку": программу, состоящую из множества вложенных друг в друга циклов. И каждый цикл был имел одну инструкцию "что-то делать" и ворох инструкций "восстановить все, как было". Но пришли объектные быдлокодеры. И засунули "матрешку циклов" внутрь "матрешки объектов". И получились наборы "фантиков" друг в друга завернутые. С редкими "конфетками" только в некоторых. И языки специальные родились, с каждым годом обновляемые, позволяющие кодерам писать конструкции синтаксически заумные, но семантического смысла лишенные.
Слово о погибели Земли Русской. И пришли системщики злобные. И заняли место хлебное. Раз так нравиться быдлокодерам писать вещи бессмысленные, то дадим им операционную систему дурацкую, не умеющую объекты синхронизировать. Пусть сами свои потоки/мьютексы разводят и сами себе стрелки/семафоры забивают...
Исторический материализм. Еще в 70-х годах прошлого века пролетарии умственного труда фирмы XEROX доказали, что ОС на файлах и сообщениях эквивалентны. Все сводится к одной несчастной очереди и паре-другой инструкций. А всю нужную для этого математику все тот же Дейкстра представил...
И нефиг множить сущности без потребности.
Тема в архиве.