为什么c ++ std :: hash创建函子结构,并且每次都可以在不创建结构的情况下调用它

问题描述 投票:1回答:1

我正在编写一个程序,该程序需要以线程安全的方式非常快地执行很多哈希操作。无论出于什么原因,每次要散列值时,c ++的std::hash似乎都需要构造函子

std::hash<std::string>{}(data);

我非常担心每次要散列值时都要分配整个结构的开销,但是我不了解在这种情况下甚至需要函子的实际原因。

创建一个哈希结构然后多次不同地调用其operator()是否安全/正确?

std::hash<std::string> strHash;
strHash(data1);
strHash(data2);

是否重新使用一个哈希结构是线程安全的?如果没有,我将如何使其更加线程安全?

c++ multithreading hash thread-safety std
1个回答
1
投票

但是我不明白在这种情况下甚至需要函子的实际原因。

std::hash是函子而不是函数的充分理由是,它可以具有状态。 C ++标准允许添加盐分的哈希值,以便同一程序的每次执行都可以为相同的原始值创建不同的哈希值。

创建一个哈希结构然后多次不同地调用其operator()是否安全/正确?

std::hash<std::string> strHash;
strHash(data1);
strHash(data2);

是的,该代码是安全的。您不需要每次想散列某些内容时都构造一个hash。可以创建单个哈希对象,并将其用于所需的所有哈希(在单线程环境中)。

是否重新使用一个哈希结构是线程安全的?如果没有,我将如何使其更加线程安全?

取决于用途,但很可能不是。 std::hash没有线程安全保证,因此您需要使用互斥或​​其他某种同步技术来保护对其的访问。

© www.soinside.com 2019 - 2024. All rights reserved.