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

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

Страницы: 13 4 5 6 7 8 Следующая »
#75
23:14, 10 дек. 2015

FordPerfect
в распределенной системе событий ни чем, в локальной type_index это то что придумали для того, что бы использовать в качестве ключа unordered_map типы, или это не совсем очевидно что в статье с этим убер хешем пытаются переизобрести rtti?

#76
23:15, 10 дек. 2015

cNoNim
> послушайте ) это какая то несуразица... вы наверное просто устали и поэтому не понимаете чего пишете
Уважаемый, я действительно начинаю уставать от вас.

cNoNim
> сколько бит у size_t?
А платформу уточните? К чему вообще этот вопрос?

cNoNim
> какая нафиг достаточно длинная строка?
Ну, относительно длинная.

Еще раз вам повторю - на практике (некоторые не только теорию на форумах флудят) - колизий у меня еще небыло. Будут - буду решать для конкретного случая.
Из примеров под рукой - тот же Doom3 который тут так боготворят - idDict в качестве ключей только строки и принимает. Функция взятия хеша от строки у них вас вообще заставит повеситься.

cNoNim
> при этом ведь я намекнул на более правильную реализацию хеширования и использования в качестве ключа type_index еще в 40 посте...
Что мне от этого толку, если, к примеру, я с Windows машины шлю событие на Linux сервер?  Соответствие std::type_info::hash_code на разных платформах стандартом не гарантируется.

#77
23:19, 10 дек. 2015

0r@ngE

!!!карл!!!
для хеш таблиц нужна не только хеш функция, нужна функция равенства
использовать хеш функцию в хеш таблица, это не тоже самое что использовать хеш в качестве ключа

#78
23:21, 10 дек. 2015

cNoNim
Конкретно type_index не гарантирует отсутствия коллизий. Конкретно GCC вызывает ровно хеш от строчки.
Если в map хранить type_info, а type_index использовать в качестве его хеш-функции, тогда ок, но таки вычисление хеша на каждый raise.

#79
23:24, 10 дек. 2015

0r@ngE
функция сравнения карл
https://github.com/id-Software/DOOM-3-BFG/blob/1caba1979589971b5e… Dict.cpp#L509

#80
23:26, 10 дек. 2015

FordPerfect
> Конкретно type_index не гарантирует отсутствия коллизий.
кэп... ты ли?

#81
23:30, 10 дек. 2015

FordPerfect
> но таки вычисление хеша на каждый raise.
таки что бы рассуждать о сложности алгоритма, для начала таки нужно выяснить нахрена этот алгоритм нужен?
правда нет других способов регистрации кроме как вычисление хеша?
помойму от счетчика зарегистрированных событий будет толку больше при регламентированном алгоритме их регистрации
чем от хеша, в случае распределенной системы событий

#82
23:32, 10 дек. 2015

cNoNim
Ну, ты же говоришь
>type_index это то что придумали для того, что бы использовать в качестве ключа unordered_map
вот я и уточняю, чем он поможет, по сравнению с кодом ТС.

#83
23:33, 10 дек. 2015

FordPerfect
в коде ТС хеш используется в качестве ключа, ты не видишь разницы между хешем и type_index?

#84
23:34, 10 дек. 2015

cNoNim
>помойму от счетчика зарегистрированных событий будет толку больше при регламентированном алгоритме их регистрации
>чем от хеша, в случае распределенной системы событий
Так с этим я не спорю. Я спрашиваю, к чему ты type_index упомянул, всего лишь.

#85
23:35, 10 дек. 2015

если мы говорим о реализации протокола распределенной системы событий, то вместо всего этого геммороя на который намекает автор статьи я выберу

enum Signals {
A,
B,
C,
D,
E,
...
};

#86
23:37, 10 дек. 2015

FordPerfect
к тому что type_index придумали для того что бы использовать вкачестве ключа в unordered_map
как раз для случаев, для которых автор занимается макроподстановками имени типа в строку и вычислением ее хеша,
без относительно применения этой схемы в распределенной системе, потому как она все равно не годится для этого

#87
23:44, 10 дек. 2015

Тю, торможу я к ночи. Cнимаю вопрос по type_index.

#88
2:12, 11 дек. 2015

cNoNim
> !!!карл!!!
> для хеш таблиц нужна не только хеш функция, нужна функция равенства
> использовать хеш функцию в хеш таблица, это не тоже самое что использовать хеш в качестве ключа
Вы издеваетесь или превысили дозу? 

inline std::size_t get_event_trait_hash()

Какую "функцию равенства"  мне нужно для size_t ? 

Added:

Вместо той истерики что вас бьет лучше бы немного остыли.

Я попробую вам розжевать если так туго.

Вот тим асслциативного контейнера в котором лежат все ивенты:

typedef std::unordered_map<std::size_t, std::unique_ptr<BasicEvent>> EventsMap;

Разжую:
типа ключа - size_t
тип значения - unique_ptr<BasicEvent>

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

Вычислением хеша занята функция:

template <typename T> inline std::size_t get_event_trait_hash() {
    static std::size_t result = 0;
    if (!result) {
        const char* traitName = get_event_trait_name<T>();
        std::hash<std::string> hasher;
        result = hasher(traitName);     // TODO: replace this with something platform-independent
    }
    return result;
}

Если, опять же, закрыть глаза на то что в примере я использовал стандартную функцию получения хеша от строки, то логика следующая:
  * при первом обращении к функции будет взят хеш от имени ивента и отдан
  * при повторных обращениях будет отдан уже посчитанный хеш

Выше я уже писал что колизии возможны, но на практике - я использую FNV-1a, и за те 7 лет что я ее использую - с колизией столкнулся лишь раз, и решилось простым переименовыванием одного элемента.  Всего раз за 7 лет.
Если столкнусь снова - буду решать на месте, но это детали.

Теперь внимание вопрос:
Какую нахрен функцию сравнения вы от меня хотите, и куда вы бы хотели ее присобачить?

PS. На всякий случай - если уж так сильно хочется обращаться ко мне по имени - то меня зовут Сергей, но никак не Карл.

#89
9:50, 11 дек. 2015

0r@ngE
> но на практике - я использую FNV-1a, и за те 7 лет что я ее использую - с
> колизией столкнулся лишь раз, и решилось простым переименовыванием одного
> элемента. Всего раз за 7 лет.
подскажиподскажите в какой отрасли ты работаешьвы работаете?

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

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