为什么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 开销,但现在您没有任何可能代价高昂的同步开销。
我正在编写一个程序,需要以线程安全的方式非常快速地执行大量哈希。无论出于何种原因,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 开销,但现在您没有任何可能代价高昂的同步开销。