首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么c++ std::散列会创建一个函子结构,并且可以在每次不创建结构的情况下调用它?

为什么c++ std::散列会创建一个函子结构,并且可以在每次不创建结构的情况下调用它?
EN

Stack Overflow用户
提问于 2020-06-01 13:37:17
回答 1查看 201关注 0票数 4

我正在编写一个程序,它需要非常快地执行大量散列,并且以线程安全的方式执行。无论出于什么原因,每当您想要散列一个值时,c++的std::hash似乎都需要构造一个函子。

std::hash{}(数据);

每当我想要散列一个值时,我都很担心分配整个结构的开销,但我不明白函子在这种情况下是必要的实际原因。

创建一个散列结构并多次调用其operator()是否安全/正确?

代码语言:javascript
复制
std::hash<std::string> strHash;
strHash(data1);
strHash(data2);

重用一个散列结构将是线程安全吗?如果没有,我怎样才能让它更安全?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-01 13:46:23

,但我不明白函子在这种情况下是必要的实际原因。

std::hash是一个函子而不是一个函数有一个很好的理由,那就是它可以有状态。C++标准允许盐渍散列,以便同一程序的每次执行都可以为相同的原始值创建不同的散列值。

是否安全/正确:创建一个散列结构,然后多次调用其运算符()?

std::hash strHash;strHash(data1);strHash(data2);

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

会重用一个散列结构为线程安全吗?如果没有,我怎样才能让它更安全?

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62133519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档