Re[6]: сопоставление сигнатур
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.11.17 15:36
Оценка:
остается делать специализации для фундаментальных и стандартных типов, и для юзерских...

думаю сделать так:
template<typename>
struct my_typeid;

template<>
struct my_typeid<bool> {
    enum: std::uint32_t { id = fnv1a("bool") };
};

template<>
struct my_typeid<std::int8_t> {
    enum: std::uint32_t { id = fnv1a("std::int8_t") };
};

макросы все упрощают...


вопрос в том, как мне суммировать id`ы, полученные при хешировании?
т.е. предполагаю что-то вроде:
constexpr std::uint32_t sig_id() { return 0; }

template<typename Arg0, typename... Args>
constexpr std::uint32_t sig_id(const Arg0&, const Args&... args) {
    constexpr std::uint32_t id = my_typeid<Arg0>::id + sig_id(args...);
}

увеличит ли простое суммирование вероятность коллизий?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 02.11.2017 22:48 niXman . Предыдущая версия .
Re[7]: сопоставление сигнатур
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.11.17 15:54
Оценка:
т.е. для контейнеров получается так:
template<typename K, typename V>
struct my_typeid<std::map<K, V>> {
    enum: std::uint32_t { id = fnv1a("std::int8_t") + my_typeid<K>::id + my_typeid<V>::id };
};

какие могут проблемы/тупики?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 02.11.2017 22:48 niXman . Предыдущая версия .
Re[8]: сопоставление сигнатур
От: Chorkov Россия  
Дата: 03.11.17 11:28
Оценка: 12 (1) +1
Здравствуйте, niXman, Вы писали:

X>т.е. для контейнеров получается так:

X>
X>template<typename K, typename V>
X>struct my_typeid<std::map<K, V>> {
X>    enum: std::uint32_t { id = fnv1a("std::int8_t") + my_typeid<K>::id + my_typeid<V>::id };
X>};
X>

X>какие могут проблемы/тупики?

my_typeid<std::map<int8_t, int32_t>>::id == my_typeid<std::map<int32_t, int8_t>>::id
Re[9]: сопоставление сигнатур
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.11.17 12:05
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>my_typeid<std::map<int8_t, int32_t>>::id == my_typeid<std::map<int32_t, int8_t>>::id


кстати да...
так как же суммировать хеши?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[10]: сопоставление сигнатур
От: Chorkov Россия  
Дата: 03.11.17 12:43
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Chorkov, Вы писали:


C>>my_typeid<std::map<int8_t, int32_t>>::id == my_typeid<std::map<int32_t, int8_t>>::id


X>кстати да...

X>так как же суммировать хеши?
Если бы не constexpr, я бы посоветовал boost::hash_combine.
А так, можно умножить на простые числа:
constexpr std::uint32_t combine( std::uint32_t id0, 
    std::uint32_t id1=0, std::uint32_t id2=0, std::uint32_t id3=0, std::uint32_t id4=0, 
    std::uint32_t id5=0, std::uint32_t id6=0, std::uint32_t id7=0, std::uint32_t id8=0)
{
    return id0*5 + id1+7 + id2*11 + id3*13 + id4*17 + id5*19 + id6*23 + id7*29 + id8*31;
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.