Войти
ПрограммированиеФорумОбщее

Простая система событий на С++11 (комментарии) (7 стр)

Страницы: 13 4 5 6 7 8 Следующая »
#90
17:34, 11 дек. 2015

cNoNim
> подскажиподскажите в какой отрасли ты работаешьвы работаете?
Не хорошо вопросом на вопрос отвечать.

0r@ngE
> Теперь внимание вопрос:
> Какую нахрен функцию сравнения вы от меня хотите, и куда вы бы хотели ее
> присобачить?
Могу я получить ответ на этот вопрос? Он меня очень интересует.


Added:
Решил что нехорошо ваш вопрос оставлять без ответа. Я работаю в геймдеве. Или вас интересует что-то более конкретное?

#91
19:04, 11 дек. 2015

0r@ngE
> Выше я уже писал что колизии возможны
Изображение
Карл, зачем вы допускаете проблемы с коллизиями там, где их можно избежать?

> Какую "функцию равенства"  мне нужно
> Могу я получить ответ на этот вопрос? Он меня очень интересует.
Разрешение коллизий
или
Идеальное хеширование

> с колизией столкнулся лишь раз
А кому-нибудь обязятельно повезёт больше и он столкнётся с коллизией два раза.

#92
19:33, 11 дек. 2015

0r@ngE

Если честно, то я мало чего могу добавить, в основном меня возмущает, что этот бред присутствует в статье цель которой чему то кого то научить,
я кроме как спросить "Где вы еще встречали подобные решения?" больше ни чего не могу... рассказы про дум3 не прокатят, я уже показал его исходники, если вы не понимаете того что я вам показываю, то смысла что либо объяснять я не вижу.
даже если так можно писать в пет проектах, в темной комнате и ни кому не показывая, это не значит что так писать нужно и меня немного шокирует попадание подобного в продакшин, возможно это в gamedev и не так страшно,
но прошу не переносите этот опыт на другие отрасли ) если вдруг придется в них работать.

можем сменить тему с хеш функций, потому как желание ее мусолить мало,
можем поговорить о ценности этой статьи в принципе,
думаю что вы согласитесь, что систему событий описаную в статье сложно назвать чем то с чего можно брать пример, и кидаться переносить в свой код, вся система сводится к тому что я написал в #57...
все ваши оправдания вроде
> Использовать планируется для передачи ивентов по сети.
это не то о чем в статье речь, потому что этого в статье нет,
встает резонный вопрос а что же в статье есть?
в статье есть какие то рассуждения на счет
tuple
integer_sequence
и генерации за их счет правильного bind
Okay...
но они не нужны, все для чего они используется в статье
решается комбинацией variadict template и lambda
bind и placeholders это атавизмы которые пролезли в стандарт из буста, но реальной ценности в них при наличии лямбд нет ни какой,
таких фич в стандарт попадает много , по тому что они кажутся крутыми, но довольно сложно смотреть на них в контексте других фич которые лезут в стандарт

#93
4:45, 12 дек. 2015

cNoNim
> можем сменить тему с хеш функций, потому как желание ее мусолить мало,
Ушли от ответа? Достойно, ничего не скажешь. А столько было истерики с картинками и видео, а в итоге пшик...

#94
7:06, 12 дек. 2015

0r@ngE
Опускаясь до хамства в адрес участников форума, тем более таких уважаемых как cNoNim, который вам всё вежливо и интеллигентно разжевал
и на пальцах объяснил, вы лишь показываете свою заниженную самооценку и ярко выраженную некомпетентность в данном вопросе.

Вот, специально для вас сделал выжимку основной идеи, на случай если вас в гугле забанили и(или) ссылки выше не открываются:

Если хеши ключей совпадают, то не факт что совпадают сами ключи, следовательно, для того чтобы убедиться что нет коллизии, нужно сравнивать ключи,
либо использовать "идеальный хеш", который не даёт коллизий, так как позволяет получить 100% уникальный хеш для любого допустимого ключа.

И на всякий случай на вашем родном языке:
Якщо хеши ключів збігаються, то не факт що збігаються самі ключі, отже, для того щоб переконатися що немає колізії, потрібно порівнювати ключі,
або використовувати "ідеальний хеш", який не дає колізій, оскільки дозволяє отримати 100% унікальний хеш для будь-якого допустимого ключа.

+ для_поднятия_настроения
#95
22:20, 12 дек. 2015
0r@ngE
> а в итоге пшик...
вы прощу прощения просто немного туговаты, вам нужна не хеш функция, а использовать вместо ключа для unordered_map, то что имеет смысл использовать, например саму строку, или пишете кроссплатформенный аналог type_index по аналогии с тем функционалом который уже реализован
при этом используете ту оптимизацию со статическим хешем, если уж в эту киллер фичу уперается профайлер, в случае коллизии хеша, делаете полное сравнение строки, при передачи по сети передаете и хеш, и строку, если хочется сэкономить на спичках, думаете о оптимизациях, а не так как сейчас,
взяли изначально бредовую концепцию и пытаемся доказать всем, что за семь лет ни единого разрыва
#96
23:06, 19 дек. 2015

Прошу прощения джентельмены, отсутствовал по семейным обстоятельствам.

Я так понимаю что дальнейший дискус не имеет смысла ув 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  которая постоянно подгавкивает вам в такт.

#97
23:37, 19 дек. 2015

Влом читать статью и срач.
Однажды в адовом угаре запилил такое:
https://github.com/Hardcode84/message-poc-poc-poc

+ Показать

#98
1:28, 20 дек. 2015

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
#99
12:17, 20 дек. 2015

cNoNim
> мне честно влом объяснять тебе что такое mainposition

Объясни мне, пожалуйста ...

#100
12:35, 20 дек. 2015

innuendo
А ты вроде читать умеешь, чего тебе непонятно в комментах в коде?

#101
16:36, 20 дек. 2015

получается, здесь неправильно, т.к. нет сравнения строк:
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);
        }
#102
21:50, 20 дек. 2015

PVSector
А ты думал один тс может неправильно использовать unordered_map?

#103
16:55, 21 дек. 2015

cNoNim
> чувак без обид, но на твои [b]сливы[/b] отвечать нет желания
Да какие обиды, я в следующий раз запощу яблоки, ну или персики ;)

innuendo
> Объясни мне, пожалуйста ...
Возвращает указатель на начало хеш-списка.

cNoNim
Мне уже надоело спорить с бараном, используйте что хотите. Т.к. все имена ивентов известны еще на этапе компиляции, можно добавить проверку на колизии в компил-тайм для особо параноидальных (хотя оно при первом же запуске тоже матюкнется), и если вам повезет словить ту сотую долю процента - то дело решится простой переименовкой проблемного ивента.  К чему вся эта ваша истерия я до сих пор в толк не возьму.

#104
18:28, 21 дек. 2015

0r@ngE
карл ) нет ни какой истерии, я уже сказал, что можно съехать с темы...
в #92 еще были вопросы кажется, есть что по ним сказать? )

Страницы: 13 4 5 6 7 8 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.