我正在编写一个程序,它需要非常快地执行大量散列,并且以线程安全的方式执行。无论出于什么原因,每当您想要散列一个值时,c++的std::hash似乎都需要构造一个函子。
std::hash{}(数据);
每当我想要散列一个值时,我都很担心分配整个结构的开销,但我不明白函子在这种情况下是必要的实际原因。
创建一个散列结构并多次调用其operator()是否安全/正确?
std::hash<std::string> strHash;
strHash(data1);
strHash(data2);重用一个散列结构将是线程安全吗?如果没有,我怎样才能让它更安全?
发布于 2020-06-01 13:46:23
,但我不明白函子在这种情况下是必要的实际原因。
std::hash是一个函子而不是一个函数有一个很好的理由,那就是它可以有状态。C++标准允许盐渍散列,以便同一程序的每次执行都可以为相同的原始值创建不同的散列值。
是否安全/正确:创建一个散列结构,然后多次调用其运算符()?
std::hash strHash;strHash(data1);strHash(data2);
是的,密码是安全的。您不需要每次想要散列某个东西时都构造一个hash。创建一个散列对象并将其用于您所需的所有散列(在单线程环境中)是可以的。
会重用一个散列结构为线程安全吗?如果没有,我怎样才能让它更安全?
取决于使用情况,但很可能不是。std::hash没有线程安全保证,所以您需要使用互斥或其他同步技术来保护对它的访问。或者,您可以只使用每个线程一个散列对象,因为它们需要为相同的输入提供相同的输出。这给了您一些额外的空间开销,但是现在您没有任何同步开销,这可能会很昂贵。
https://stackoverflow.com/questions/62133519
复制相似问题