4
我在尋找一個具有關聯屬性的hash_combine
函數。替代boost :: 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
功能?
P.S .:這樣做的原因是我將散列鍵分配給我在DAG中找到的序列。我正在運行動態編程來查找所有狀態對(之間的序列)的哈希鍵。
謝謝,這將工作。有沒有人知道這與'hash_combine'的行爲,就可能的碰撞等而言? – Frank 2011-05-18 01:42:22
[參考文檔](http://www.boost.org/doc/libs/1_46_1/doc/html/hash/reference.html#boost.hash_combine)具有'boost :: hash_combine'使用的確切公式。 – 2011-05-18 01:57:15
用xor可以看到的一個直接問題是任何A的A^A == 0。所以[a,a],[b,b],[c,c] ...都將具有相同的散列。另外,[a,b,c,a]與[b,c]具有相同的散列。對於這些情況,'+'會比'^'做得更好。 – 2011-05-18 01:57:55