【问题标题】:Tell std::unordered_map that the hash function is perfect告诉 std::unordered_map 哈希函数是完美的
【发布时间】:2022-11-02 05:47:34
【问题描述】:

是否可以告诉std::unordered_map 哈希函数是完美的?

因此,如果两个不同的键产生相同的哈希码,它们会编辑相同的内存槽。

【问题讨论】:

    标签: c++ std unordered-map


    【解决方案1】:

    哈希函数仅仅完善是不够的。生成不同哈希值的值可能会映射到哈希表中的同一槽。例如,容器的大小可能是 11,其中一个哈希值可以是 12,另一个可以是 23。假设容器使用模运算符来映射这些值,它们都将映射到插槽号 1。所以,你需要一种方法来区分这些。

    【讨论】:

      【解决方案2】:

      您可以将std::unordered_mapKeyEqual 模板参数设置为[](const auto& l,const auto& r){return true;},因为它只应在哈希比较相等时使用。

      【讨论】:

        【解决方案3】:

        使operator== 产生与散列而不是属性的比较,将导致std::unordered_map 假设它们是相等的。

        【讨论】:

        • 这可能只是导致哈希函数被更频繁地调用。通常相等比实现哈希函数更便宜。我看不出这将如何更好地优化地图数据结构。
        • @fabian 我没有想到这一点,但是由于我的哈希函数会促进冲突以编辑相同的插槽,因此它实际上是一个非常快速且简单的方法。
        猜你喜欢
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 2011-11-05
        • 2013-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多