对自定义类使用 std::hash<uint64_t>

Using std::hash<uint64_t> for custom class

本文关键字:lt gt uint64 hash 自定义 std      更新时间:2023-10-16

以下两个返回语句是否返回相同的内容?

class NonTrivialClass
{
public:
size_t hash() const
{
// variation 1
return std::hash<uint64_t>::_Do_hash(my_val_);
// variation 2, wanted to avoid creating the named object
std::hash<uint64_t> hasher;
return hasher(my_val_);
}
private:
// relevant info for hashing purposes is stored here
uint64_t my_val_;
}

我直觉上想写类似的东西

return std::hash<uint_64>(my_val_);

没有编译(因为我没有初始化结构的实例?!我错过了另一种方式吗?担心创建命名哈希结构是不必要的吗?

一种更简单的编写方法是使用临时对象:

return std::hash<uint64_t>{}(my_val_);

它与第二种方法相同。

我不能确定_Do_hash做什么,但无论如何它是非标准的,不应该使用,以避免可移植性问题。

由于谷歌搜索没有找到该函数的任何文档,因此我假设它是您正在使用的标准库实现的实现细节,并不意味着由用户代码使用。因此,即使您不关心可移植性,也根本不应该使用它。

另请注意,无论您使用带有命名变量的方法还是使用临时变量的方法,对性能都无关紧要。编译器几乎肯定会从中生成相同的代码。您使用哪个纯粹是代码风格的问题。