std :: hash算法和大小

Æle*_*lex 3 c++ algorithm hash c++11 stdhash

我正在使用C++ 11和std :: hash算法.我想知道,使用了什么实际的哈希实现?我会假设MD5或SHA,但我不能从互联网上挖掘任何信息.

另外,我想知道散列的实际返回位宽,因为我必须将它存储在MySQL中.

最后,是否最好使用std :: hash,比如说其他一些库如crypto ++?

Jac*_*ack 8

选择的算法std::hash完全取决于实现.可能既不使用MD5也不使用SHA,因为它们会成为性能杀手.

大多数实现将比上面提到的要简单得多,因为没有加密要求,std::hash而MD5和SHA是为加密目的而开发的.

要求std::hash严格得多:

  1. 接受单个类型的参数Key.
  2. 返回size_t表示参数哈希值的type 值.
  3. 调用时不抛出异常.
  4. 对于两个参数k1,并k2认为是相等的,std::hash<Key>()(k1) == std::hash<Key>()(k2).
  5. 对于两个不同的参数k1k2不相等的,但这种可能性std::hash<Key>()(k1) == std::hash<Key>()(k2)应该是非常小的,接近1.0/std::numeric_limits<size_t>::max().

  • "我正在广泛使用std :: hash来创建唯一标识符." 我把它当作:"我想要一个库来生成[UUID](http://en.wikipedia.org/wiki/Universally_unique_identifier)s".那不是`std :: hash`. (4认同)
  • 您必须了解`std :: hash`提供的唯一性与加密安全性无关.它的实现主要用于像map这样的关联无序容器.实现不关心加密,它关心用于管理哈希表的效率.如果您需要加密安全性,那么您应该真正指向用于此目的的外部库. (2认同)
  • @Alex,@ peppe.我同意,你想要一个UID类型,比如标准定义的UUID,在几个库中实现,包括[`boost :: uuid`](http://www.boost.org/doc/libs/release/libs/ UUID /). (2认同)