【问题标题】:std::hash algorithm and sizestd::hash 算法和大小
【发布时间】:2013-12-03 10:40:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ algorithm c++11 hash stdhash


    【解决方案1】:

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

    大多数实现将比上述简单得多,因为 std::hash 没有加密要求,而 MD5 和 SHA 已被开发用于加密目的。

    std::hashrequirements 没有那么严格:

    1. 接受Key 类型的单个参数。
    2. 返回一个size_t 类型的值,表示参数的哈希值。
    3. 调用时不抛出异常。
    4. 对于两个相等的参数k1k2std::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 提供的唯一性与密码安全性无关。它的实现主要用于关联无序容器,如 map。该实现不关心加密,它关心用于管理哈希表时的效率。如果您需要加密安全,那么您真的应该指向一个用于该目的的外部库。
    • 你在说什么?预计任何哈希表都会发生冲突!
    • “我广泛使用 std::hash 来创建唯一标识符。”我将其视为:“我想要一个库来生成UUIDs”。那不是std::hash
    • @Alex,@peppe。我同意,您想要一个 UID 类型,例如标准定义的 UUID,在多个库中实现,包括 boost::uuid
    • @Alex,UUID 实现了字符串数据的 SHA 和 MD5 哈希,以及完全伪随机生成的,如果您有兴趣的话。阅读UUIDs
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2012-12-10
    • 2014-01-08
    • 2021-06-30
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多