Alternatives to boost::hash_combine that have associative property?
I am looking for a hash_combine
function that has the associative property.
For example, I'd like to be able to either combine the values a, b, c, d one after another to get the hash key for the sequence, or combine a and b, then c and d, and combine the results. The two methods should give the same result.
boost::hash_combine
does not have that property:
// a * b * c * d 开发者_如何学C
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
Is there any good hash_combine
function that has it?
P.S.: The reason for doing this is that I assign hash keys to sequences that I find in a DAG. I'm running dynamic programming to find the hash keys for (the sequences between) all pairs of states.
How about plain xor?
std::size_t seed = 0;
seed ^= boost::hash_value(234);
seed ^= boost::hash_value(62);
...
精彩评论