2013-07-26 30 views
1

嗨我有一個關於std :: hash的問題,如果我有2個大字符串比較,我願意接受std :: hash在大多數情況下會比較平等,而不是直接進行字符串比較,而是更符合性地執行類似以下內容的操作?另外考慮這將在循環讀取一個文件,所以它會被執行幾次,這是大型文件的關注。C++ 11速度比較/成本標準差::散列<std::string>等於與std ::字符串直接等於兩個大字符串

std::string largeString1; // large but not huge meaning a line of text like up to lets say 500 chars 
std::string largeString2; 

// is this better than then next block in terms of performance and if so by how much? 
if (std::hash<std::string>(largeString1) == std::hash<std::string>(largeString2)) 
{ 
// true logic 
} 

// is this a lot slower than the previous 
if (largeString1 == largeString2) 
{ 
// true logic 
} 
+2

如果兩個不同字符串之間存在散列衝突會怎樣?這兩種比較在這種情況下會產生不同的結果。此外,大多數(全部?)實現將實現字符串比較作爲渴望的比較,在找到第一個不匹配時退出;計算哈希值時不是這種情況。 – Praetorian

+0

是的第二次想到這可能不是一個很好的問題,我認爲通過散列字符串我以某種方式獲得性能,不必通過字符比較來做char,但是當你和Mooing Duck表明我應該相信lib實現是快速默認。 – bjackfly

回答

4
std::hash<std::string>(largeString1) == std::hash<std::string>(largeString2) 

將遠遠慢

largeString1 == largeString2 

散列字符串涉及迭代的它的整個長度。所以哈希比較需要代碼一次遍歷兩個字符串的全部長度,並通過複數方程運行它們。直接相等代碼只是在同一時間迭代它們,並立即退出發現差異的時刻。相信圖書館。如果==可以做得更快,他們會做得更快。

如果你要在每個字符串多次比較,然後散列提前一次,比較公正的散列可能會更快,但你仍然要確認比賽,因爲比較散列可以產生假陽性。它只會加快「不匹配」的情況。

+0

在絕大多數情況下,你絕對正確。但是,考慮一個場景,您必須反覆比較相同的字符串。計算了散列後,你可以更快地執行不等式檢查(顯然,一旦散列匹配,相等性必須以正常方式計算) – Vadim

+0

@Vadim:將其編輯到答案中 –

+2

如果您不期望字符串經常是相同的大小,首先檢查長度是否相等會更快(operator ==在通過字符比較進行字符前首先執行此操作)。我們只考慮預先計算的哈希比較首先會更快的主要情況(主要是長度相同的字符串和相同的初始子字符串),但即使如此,我也可以提出一個更好的算法(在這種情況下,比如進行相等比較從右到左的字符)比首先檢查哈希。 – Nevin