我正在编写一个程序,该程序需要以线程安全的方式非常快地执行很多哈希操作。无论出于什么原因,每次要散列值时,c ++的std::hash
似乎都需要构造函子
std::hash<std::string>{}(data);
我非常担心每次要散列值时都要分配整个结构的开销,但是我不了解在这种情况下甚至需要函子的实际原因。
创建一个哈希结构然后多次不同地调用其operator()
是否安全/正确?
std::hash<std::string> strHash;
strHash(data1);
strHash(data2);
是否重新使用一个哈希结构是线程安全的?如果没有,我将如何使其更加线程安全?
但是我不明白在这种情况下甚至需要函子的实际原因。
std::hash
是函子而不是函数的充分理由是,它可以具有状态。 C ++标准允许添加盐分的哈希值,以便同一程序的每次执行都可以为相同的原始值创建不同的哈希值。
创建一个哈希结构然后多次不同地调用其operator()是否安全/正确?
std::hash<std::string> strHash; strHash(data1); strHash(data2);
是的,该代码是安全的。您不需要每次想散列某些内容时都构造一个hash
。可以创建单个哈希对象,并将其用于所需的所有哈希(在单线程环境中)。
是否重新使用一个哈希结构是线程安全的?如果没有,我将如何使其更加线程安全?
取决于用途,但很可能不是。 std::hash
没有线程安全保证,因此您需要使用互斥或其他某种同步技术来保护对其的访问。