Альтернативы для повышения :: hash_combine, которые имеют ассоциативное свойство? - PullRequest
4 голосов
/ 18 мая 2011

Я ищу функцию 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: Причиной для этого является то, что я назначаю хэш-ключи для последовательностей, которые я нахожу в группе обеспечения доступности баз данных.Я запускаю динамическое программирование, чтобы найти хеш-ключи (последовательности между) для всех пар состояний.

1 Ответ

1 голос
/ 18 мая 2011

Как насчет простого xor?

std::size_t seed = 0;
seed ^= boost::hash_value(234);
seed ^= boost::hash_value(62);
...
...