c++11速度比较/成本std::hashequal与直接在两个大字符串上的std::string equal

c++11速度比较/成本std::hashequal与直接在两个大字符串上的std::string equal,c++11,hash,stdhash,C++11,Hash,Stdhash,您好,我有一个关于std::hash的问题,如果我有两个大字符串进行比较,我愿意接受std::hash在大多数情况下比较相等,那么执行以下操作而不是直接进行字符串比较是否更符合性能要求?还考虑这将是一个循环读取一个文件,所以它将被执行几次,这是对大型文件的关注。 std::string largeString1; // large but not huge meaning a line of text like up to lets say 500 chars std::string lar

您好,我有一个关于std::hash的问题,如果我有两个大字符串进行比较,我愿意接受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
}
对字符串进行散列涉及对其整个长度进行迭代。因此,哈希比较需要代码一次迭代两个字符串的完整长度,并通过复杂的方程运行它们。直接相等代码只是在同一时间重复它们,并在发现差异时立即退出。相信图书馆。如果==可以做得更快,他们会做得更快

如果要对每个字符串进行多次比较,那么提前进行一次散列并仅比较散列可能会更快,但仍然需要确认匹配,因为比较散列可能会产生误报。它只会使不匹配的情况更快

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


如果要对每个字符串进行多次比较,那么提前进行一次散列并仅比较散列可能会更快,但仍然需要确认匹配,因为比较散列可能会产生误报。它只会加快不匹配的大小写速度。

如果两个不同字符串之间存在哈希冲突,该怎么办?在这种情况下,两种比较将产生不同的结果。还有,最重要的是?实现将实现字符串比较作为一个急切的比较,在发现第一个不匹配时退出;计算散列时不是这样的。是的,仔细想想,这可能不是一个很好的问题,我认为通过散列字符串,我不必逐字符比较,以某种方式获得了性能,但正如您和Mooing Duck所表明的,我应该相信lib实现在默认情况下是快速的。如果出现散列冲突呢在两个不同的字符串之间?在这种情况下,两种比较将产生不同的结果。还有,最重要的是?实现将实现字符串比较作为一个急切的比较,在发现第一个不匹配时退出;计算散列时不是这样的。是的,仔细想想,这可能不是一个好问题,我认为通过对字符串进行散列,我不必逐字符比较,以某种方式获得了性能,但正如您和Mooing Duck所表明的,我应该相信lib实现在默认情况下是快速的。您在绝大多数情况下。但是,考虑一个场景,您必须反复地重复相同的字符串。使用计算的哈希将允许您更快地执行不平等性检查。显然,一旦哈希计算完成,也必须以正常方式计算相等性match@Vadim:将其编辑到回答中如果您不希望经常使用相同大小的字符串,在逐个字符比较之前,首先检查相等运算符==的长度会更快。我们只讨论了路径情况,即先进行预计算哈希比较会更快,主要是相同长度的字符串和相同的初始子字符串,但即使这样,我也能想出一个更好的算法,比如从右到左对字符进行相等比较,而不是先检查散列。在绝大多数情况下,你是绝对正确的。但是,考虑一个场景,您必须反复地重复相同的字符串。使用计算的哈希将允许您更快地执行不平等性检查。显然,一旦哈希计算完成,也必须以正常方式计算相等性match@Vadim:将其编辑到回答中如果您不希望经常使用相同大小的字符串,在逐个字符比较之前,首先检查相等运算符==的长度会更快。我们只讨论了路径情况,在这种情况下,首先进行预计算的哈希比较会更快,主要是相同长度的字符串和相同的初始子字符串,但即使如此,在这种情况下,我也可以想出一个更好的算法,比如从右到左进行字符的相等性比较,而不是先检查哈希。
std::hash<std::string>(largeString1) == std::hash<std::string>(largeString2)
largeString1 == largeString2