![](/img/trans.png)
[英]Why can't a struct defined inside a function be used as functor to std::for_each?
[英]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.