STL哈希函数

15

STL有公开的哈希函数吗?

我知道有一些非标准实现使用哈希值(例如boost::hash_map),而MSVC8实现了一个版本的hash_map/hash_set等。

但是C++98 STL中是否定义了任何哈希函数

如果没有,那么最好的可靠哈希函数的非C++98来源是什么?

首选来源顺序(从最可接受到最不可接受):Boost,C++0x标准STL,TR1,其他第三方。


C++98不包括任何哈希容器,因此自然也不包括任何哈希函数。 - Mark Ransom
3个回答

16

总结一下:

所有这些哈希函数都是为散列式关联容器设计的,而不是用于加密。


3
我认为第一个观点是错误的。STL没有哈希函数。你发布的链接中SGI的STL实现明确引用了“这个类是SGI的扩展,不是C++标准的一部分”。 - J T
2
@J T:这有点过时了。(HP/SGI) STL在C++98之前就已经存在,并且当时就有哈希函数。并非STL的所有部分都被纳入C++98;SGI随后将这些部分记录为“标准扩展”。有关更多详细信息,请参阅Matt Austern的STL书籍。 - MSalters
@Boaz, @MSalters:嗯,很有趣。谢谢你们提供的信息。 - J T
1
@Boaz Yaniv:这里有一个很好的答案:https://dev59.com/UG435IYBdhLWcg3wyzaa#5205571 - Cubbi
1
我注意到您正在引用C++11的N3242版本。就在今天,最终的C++11草案已经发布,即N3290: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf。 - Howard Hinnant
显示剩余3条评论

3
我猜你正在寻找用于哈希表的哈希函数,而不是用于加密学的哈希函数,对吗?
如果是这样,那么 boost::hash 怎么样?
文档说明它与 TR1 哈希兼容,TR1 哈希应该成为即将到来的 C++0x 标准的一部分。这意味着它可能已经存在于许多编译器中。
对于加密哈希,Boost 中似乎有一个 SHA-1 实现,但如果需要重量级的哈希函数,则最好使用专用库,例如 Crypto++

实际上,这是出于加密原因。我会更新问题的标签。 - J T
如果你已经在使用boost,那么它似乎有这个功能(http://www.boost.org/doc/libs/1_46_1/boost/uuid/sha1.hpp)。否则,你可以使用像Crypto++这样的加密库。 - Boaz Yaniv
SHA-1在detail命名空间中,意味着它不应该在boost.uuids之外使用。我们必须等待boost.crypto,这可能正在等待boost.mp_math。 - Cubbi
或者我们可以使用一个专门的加密库。我知道我会这样做。 - Boaz Yaniv

0

哈希函数的选择理想情况下取决于您对结果的使用。我怀疑这可能部分原因是因为“一刀切”的想法不适用于所有情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接