0r@ngE
Опускаясь до хамства в адрес участников форума, тем более таких уважаемых как cNoNim, который вам всё вежливо и интеллигентно разжевал
и на пальцах объяснил, вы лишь показываете свою заниженную самооценку и ярко выраженную некомпетентность в данном вопросе.
Вот, специально для вас сделал выжимку основной идеи, на случай если вас в гугле забанили и(или) ссылки выше не открываются:
Прошу прощения джентельмены, отсутствовал по семейным обстоятельствам.
Я так понимаю что дальнейший дискус не имеет смысла ув 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
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 доказали, что ОС на файлах и сообщениях эквивалентны. Все сводится к одной несчастной очереди и паре-другой инструкций. А всю нужную для этого математику все тот же Дейкстра представил...
И нефиг множить сущности без потребности.
Тема в архиве.