2015-12-13 27 views
0

是否有可能找出unordered_set中元素的散列值(散列鍵)?獲取無序散列值並且是恆定的

例如;

unordered_set<string> errorStates; 
errorStates.insert("File does not exist"); 

// Can I get the hash of this key? 
int ERR_FILE_NOT_EXISTS = errorStates.keyHash("File does not exist"); 

此外,散列File does not exist總是相同嗎?如果我運行我的程序並將20個值插入到errorStates中,並且運行程序並插入200時,哈希值是否相同?這個想法是散列將是唯一的錯誤ID並將散列寫入文件。

我正在創建Status類,以輕鬆地從函數返回錯誤/成功結果,並從錯誤代碼中獲取錯誤消息 - 請參閱下面的部分實現。但也許有更好的更合適的方式?

//usage 
Status evtState = onMouseMove(); 
Status copyState = fileCopy(); 

class Status 
{ 
public: 
    static STATE registerState(const tstring &stateMsg) 
    { 
     states.emplace(stateMsg); 
     return states.hashValue(stateMsg); 
    } 

    Status(const STATE &state) : state(state) {} 
    ~Status() {} 

    string toString() 
    { 
     unordered_set<tstring>::const_iterator ele = states.find(state); 

     return (ele != states.end()) ? *ele : "Undefined"; 
    } 

    ostream& operator<<(Status& obj) 
    { 
     return cout << obj.toString(); 
    } 

private: 
    static unordered_set<tstring> states; 

    const STATE state; 
}; 
+1

'有可能找出一個unordered_set'中的元素的散列值(哈希鍵)嗎?當然:'my_set.hash_function()(element)'。 –

+0

@IgorTandetnik謝謝你的答案的一部分。散列總是恆定的?無論設置的大小,OS 32位還是64位? –

+0

'散列總是一樣嗎?'它更好。如果集合的哈希值不斷變化,集合如何能夠找到任何元素?它不是一個散列函數,更像一個隨機數生成器。 –

回答

1

它可以從一個std::unordered_set檢索散列函數,並用它來尋找一個關鍵的哈希值。

size_t h = myset.hash_function()("hello world"); 

請問哈希是相同的,如果我跑我的程序,並插入20個值到errorStates,當我運行該程序,並插入200?

std::unordered_set<T>的默認散列函數是std::hash<T>。該類模板的其中一個要求如下:

返回的值應該僅取決於程序持續時間的參數k。 [注意:因此,對於給定執行程序的 ,具有相同k值的所有對 表達式h(k)的評估產生相同的結果。末端注]

隨着h是一個std::hash<T>k是一個T

我對此的解釋是,在程序的任何一次執行中,特定密鑰的哈希值將是相同的。但是,在一系列運行中,表達式h(k)不需要相同。

因此,插入的值的數量將不會僅在一次特定的執行中更改密鑰的散列值,。您不能假設密鑰的哈希值在多次執行時保持不變。

1

我可以得到這個密鑰的哈希值嗎?

肯定的:

size_t hashval = errorState.hash_function()("File does not exist"); 

會爲文件的哈希並不總是存在一樣嗎?如果我運行我的程序並將20個值插入錯誤狀態,並且運行程序並插入200時,哈希值是否相同?

在程序的一次運行中它不會改變。向std::set添加數千個元素不會更改任何密鑰的哈希值。但是,如果再次運行相同的程序,散列值可能會不同(q.v.散列隨機)。如果你在另一臺機器上運行程序,或者甚至使用不同的標準庫實現...

這個想法是散列將是唯一的錯誤ID並將散列寫入文件。

這不會有兩個原因工作:

  1. 如上所述,散列值可以是在同一程序的兩個不同的執行不同。所以他們不應該被堅持。

  2. 哈希值不是唯一的。兩個不同的密鑰具有相同的散列值是完全可能的(也是相當普遍的)。這被稱爲「散列衝突」。 (請參閱「生日悖論」)。