2011-05-17 31 views
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中找到的序列。我正在運行動態編程來查找所有狀態對(之間的序列)的哈希鍵。

回答

1

平原xor怎麼樣?

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

謝謝,這將工作。有沒有人知道這與'hash_combine'的行爲,就可能的碰撞等而言? – Frank 2011-05-18 01:42:22

+0

[參考文檔](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

+0

用xor可以看到的一個直接問題是任何A的A^A == 0。所以[a,a],[b,b],[c,c] ...都將具有相同的散列。另外,[a,b,c,a]與[b,c]具有相同的散列。對於這些情況,'+'會比'^'做得更好。 – 2011-05-18 01:57:55