問題如何爲用戶定義的類型專門化std :: hash <T>?
什麼是性病的一個很好的專業化::散在性病的第三個模板參數:: unordered_map或std :: unordered_set針對其所有成員的數據類型已經有一個用戶定義的類型使用std :: hash的一個很好的特化?
對於這個問題,我將「好」定義爲實現和理解起來很簡單,合理高效並且不太可能產生散列表衝突。商品的定義不包括任何有關安全的陳述。
什麼是Google'able
此刻的國家,兩種StackOverflow的問題對谷歌搜索「STD哈希專業化」的第一個命中。
第一個How to specialize std::hash::operator() for user-defined type in unordered containers?解決打開標準名稱空間和添加模板專用化是否合法的問題。
第二個,How to specialize std::hash for type from other library,基本上解決了同樣的問題。
這留下了當前的問題。假定C++標準庫的實現爲標準庫中的原始類型和類型定義了哈希函數,那麼爲用戶定義的類型專門化std :: hash的簡單而有效的方法是什麼?有沒有一種好的方法來結合標準庫實現提供的散列函數?
(編輯感謝dyp。)Another question StackOverflow地址如何組合一個對散列函數。
Google的其他結果沒有任何幫助。
This Dr. Dobbs的文章指出,兩個令人滿意的散列的XOR會產生新的令人滿意的散列。
This文章似乎是從知識發言,並暗示很多事情,但對細節輕描淡寫。它在第一個例子中與Dobbs博士的文章相矛盾,他說使用XOR結合散列函數會導致散列函數的弱化。
因爲應用於任何兩個相等值的XOR結果爲0,所以我可以看到爲什麼XOR本身很弱。
元問題
一個良好的理由的回答解釋爲什麼這個問題是無效的,不能籠統地回答也將受到歡迎。
也許你應該添加到列表中的問題有關[組合哈希](http://stackoverflow.com/q/2590677)? – dyp
啊,很好,我沒有找到那個。這可能實際上是一個答案。 – Praxeolitic
嗯,我不確定。這個答案適用於*兩個*值,我不知道當遞歸地應用於N值時算法的質量是否足夠好。看起來即使是'tuple'也不能與標準工具一起使用,參見http://stackoverflow.com/q/7110301 – dyp