为什么c++std::hash创建了一个仿函数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 似乎每次要散列值时都需要构造一个函子

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

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

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

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

重复使用一个散列结构会是线程安全的吗?如果不是,我怎样才能让它更线程安全?

but I don't understand the actual reason a functor is even necessary in this context.

std::hash 是仿函数而不是函数,这是有充分理由的,那就是它可以有状态。 C++ 标准允许使用加盐哈希,因此同一程序的每次执行都可以为相同的原始值创建不同的哈希值。

Is it safe / correct to create one hash struct then call its operator() multiple different times?

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

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

Is re-using one hash struct going to be threadsafe? And if not, how would I make it more threadsafe?

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