c++11 速度比较/成本 std::hash<std::string> equal 与 std::string equal 直接在 2 个大字符串上

bja*_*fly 4 hash c++11 stdhash

您好,我对 std::hash 有一个问题,如果我有 2 个大字符串进行比较,并且我愿意接受 std::hash 在大多数情况下比较相等,那么执行类似以下操作而不是直接执行操作是否更符合性能字符串比较?还要考虑这将在循环中读取文件,因此它将被执行多次,这是大文件的问题。

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
}
Run Code Online (Sandbox Code Playgroud)

Moo*_*uck 11

std::hash<std::string>(largeString1) == std::hash<std::string>(largeString2)
Run Code Online (Sandbox Code Playgroud)

很多

largeString1 == largeString2
Run Code Online (Sandbox Code Playgroud)

对字符串进行哈希处理涉及迭代其整个长度。因此,哈希比较需要代码一次迭代两个字符串的完整长度,并通过复杂的方程运行它们。直接相等代码只是同时迭代它们,并在发现差异时立即退出。相信图书馆。如果==可以做得更快,他们就会做得更快。

如果您要多次比较每个字符串,那么提前散列一次并仅比较散列可能会更快,但您仍然必须确认匹配,因为比较散列可能会给出误报。它只会使“不匹配”的情况更快。

  • 如果您不经常期望字符串大小相同,那么首先检查长度是否相等会更快(运算符 == 在进行逐个字符比较之前首先执行此操作)。我们只讨论病态的情况,首先进行预先计算的哈希比较会更快(主要是相同长度的字符串和相同的初始子字符串),但即便如此,我也可以想出一个更好的算法(在这种情况下,例如进行相等比较从右到左的字符)而不是首先检查哈希值。 (2认同)