2013-02-18 29 views
0

我想將大約100個非負32位整數的列表壓縮爲一個整數。理想情況下,生成的整數總是唯一的,但少數幾個相對罕見的碰撞是可以接受的。 我該怎麼做?在C++中將整數表示爲單個整數

我正在寫一個解謎遊戲。我的搜索算法的一部分是避免重新探索已經看到的拼圖狀態。我將使用列表中生成的整數作爲statesAlreadySeen表中的關鍵字。目前我使用字符串作爲鍵。但是,我從字符串鍵到map<,>中的整數鍵時看到了顯着的性能改進,因此我想切換。

編輯:感謝無序的地圖建議!不過,我仍然對實際的哈希函數感到好奇。 IIRC有一個簡單的函數,涉及基本的位操作和xoring。很高興看到這一點,並對碰撞概率有一些總體的瞭解。

+5

您需要使用[* hash函數*](http://en.wikipedia.org/wiki/Hash_function)。 – 2013-02-18 00:30:20

+1

@OliCharlesworth崗位作爲回答,它不需要更詳細 – djechlin 2013-02-18 00:32:07

+1

像'提振:: hash_range'應該傳達的基本思想...... – 2013-02-18 00:32:42

回答

2

正如評論中所建議的那樣,您需要使用散列函數。與boost::hash_range最容易實現:

#include <boost/functional/hash.hpp> 
std::size_t vectorhash(std::vector<int> f){ 
    size_t hash = std::size_t hash = boost::hash_range(f.begin(), f.end()); 
} 

話雖如此,如果你沒有一個真正的需要,以保持美國訂購(我不明白爲什麼你會),我會的US2012的解決方案去保留string鍵和切換到unordered_map - 從而讓容器負責散列。

+1

增加了#include,謝謝 – eladidan 2013-02-18 01:31:21