Безопасно ли получать битовую маску от ha sh следующим образом (uint64_t) 0x1L << (uint64_t) ((name_ha sh)% 63L) - PullRequest
1 голос
/ 06 апреля 2020
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. Как я могу оценить эту вероятность?

...