Я ищу функцию hash_combine
, которая обладает ассоциативным свойством.
Например, я хотел бы иметь возможность либо комбинировать значения a, b, c, d один за другим, чтобы получить хеш-ключ для последовательности, либо комбинировать a и b, затем c и dи объединить результаты.Два метода должны давать одинаковый результат.
boost::hash_combine
не обладает этим свойством:
// a * b * c * d
std::size_t seed = 0;
boost::hash_combine(seed, 234);
boost::hash_combine(seed, 62);
boost::hash_combine(seed, 675);
boost::hash_combine(seed, 916);
std::cout << seed << std::endl; // 706245846748881
// (a * b) * (c * d)
std::size_t seed1 = 0;
boost::hash_combine(seed1, 234);
boost::hash_combine(seed1, 62);
std::size_t seed2 = 0;
boost::hash_combine(seed2, 675);
boost::hash_combine(seed2, 916);
boost::hash_combine(seed1, seed2); // 11337801211148
Есть ли какая-нибудь хорошая функция hash_combine
, которая имеет это?
PS: Причиной для этого является то, что я назначаю хэш-ключи для последовательностей, которые я нахожу в группе обеспечения доступности баз данных.Я запускаю динамическое программирование, чтобы найти хеш-ключи (последовательности между) для всех пар состояний.