哈希<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::string
s 和 c 字符串的混合以及 c 字符串的大小很重要,因为 SSO(短字符串优化)可能使 std::hash<std::string>
成为更好的选择。
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 thanstd::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::string
s 和 c 字符串的混合以及 c 字符串的大小很重要,因为 SSO(短字符串优化)可能使 std::hash<std::string>
成为更好的选择。