繁体   English   中英

为什么c++ std::hash会创建一个functor struct,并且每次不创建struct就可以调用

[英]Why does c++ std::hash create a functor struct and can it be called without creating a struct each time

我正在编写一个程序,该程序需要非常快速地以线程安全的方式执行大量哈希。 无论出于何种原因,c++ 的std::hash似乎每次你想要 hash 一个值时都需要构造一个仿函数

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

我非常担心每次我想 hash 一个值时分配整个结构的开销,但我不明白在这种情况下甚至需要仿函数的实际原因。

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

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

重复使用一个 hash 结构会是线程安全的吗? 如果没有,我将如何使它更线程安全?

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

std::hash是函子而不是 function 有充分的理由,那就是它可以有 state。 C++ 标准允许加盐散列,以便同一程序的每次执行都可以为相同的原始值创建不同的散列值。

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

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

是的,该代码是安全的。 每次你想要 hash 的东西时,你不需要构造一个hash 可以创建一个 hash object 并将其用于您需要的所有哈希(在单线程环境中)。

重复使用一个 hash 结构会是线程安全的吗? 如果没有,我将如何使它更线程安全?

取决于用途,但很可能不是。 std::hash没有线程安全保证,因此您需要使用互斥锁或其他一些同步技术来保护对它的访问。 或者您可以只使用一个 hash object 每个线程,因为它们需要为相同的输入提供相同的 output。 这为您提供了一些额外的空间开销,但现在您没有任何可能代价高昂的同步开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM