template<typename T>
static constexpr MetatypeHash build_hash() {
using sanitized = std::remove_const_t<std::remove_reference_t<T>>;
MetatypeHash hash;
hash.name_hash = MetatypeHash::hash<sanitized>();
hash.matcher_hash |= (uint64_t)0x1L << (uint64_t)((hash.name_hash) % 63L);
return hash;
};
Каждый метатип имеет name_ha sh - 64-битный FNV-1a га sh имени типа (строка)
matcher_ha sh - бит, установленный в некоторой случайной позиции , Думайте об этом как о битовой подписи архетипа. Архетипы хранятся в контейнере, мы можем запросить архетипы формы контейнера, используя битовую маску.
auto build_matcher = [](const std::vector<MetatypeHash>& types) {
size_t and_hash = 0;
for (auto type : types)
{
and_hash |= type.matcher_hash;
}
return and_hash;
};
Эта кодовая форма DECS https://github.com/vblanco20-1/decs
Вопрос: Является ли этот метод генерации формы битовой сигнатуры ha sh достаточным для этой цели? Я думаю, что мы получим большую вероятность столкновения (из-за операции по модулю) намного больше, чем фактическая вероятность столкновения для функции ha sh, используемой для name_ha sh. Как я могу оценить эту вероятность?