哈希<std::string> 与哈希<std::string_view>

hash<std::string> vs hash<std::string_view>

C++17 引入 hash<string_view>。在编写我自己的自定义哈希时,我想重用字符串哈希的 STL 实现。

std::hash<std::string>()("Hello, world")std::hash<std::string_view>()("Hello, world") 慢吗?一样吗?

我什么时候想使用 std::hash<std::string>()

Is std::hash<std::string>()("Hello, world") slower than std::hash<std::string_view>()("Hello, world")?

是的。

前者较慢,因为创建 std::string 比创建 std::string_view 慢。

When do I ever want to use std::hash<std::string>()?

当您有一个 std::string 对象并且您想要从中计算哈希值时。

std::hash<std::string>std::string const& 作为其 operator() 的参数。如果您有 std::string,并且您正在散列它们,那么这就是您想要的。如果您使用 hash<string_view>,那么它将不得不将 std::string 转换为 std::string_view,这会产生一些成本(不多,但确实存在)。

如果您的数据集不仅包含 std::string 还包含 C 字符串,那么 hash<string_view> 会更好。将 c 字符串转换为 std::string 可能需要动态内存分配,因此如果您可以避免这种情况,通常您会在性能方面获胜。这需要分析,因为 std::strings 和 c 字符串的混合以及 c 字符串的大小很重要,因为 SSO(短字符串优化)可能使 std::hash<std::string> 成为更好的选择。