获取已知哈希输出的映射值

时间:2017-02-06 20:46:40

标签: c++ hash

我有一个std::unordered_map myMap,其键值对为<Key*, Value>Key定义如下:

struct Key
{
    unsigned long int UniqueValue;
    unsigned long int NonnUniqueValue;
}

该计划的其余部分确保UniqueValueKey的每个实例都是唯一的,但{}之间NonUniqueValue可能不同。我的哈希函数定义为:

struct KeyHash
{
    std::size_t operator()(const Key& k) const
    {
        return k.UniqueValue;
    }
}

然后我的地图是:

std::unordered_map<Key*, Value, KeyHash> myMap;

因此,基本上,每个密钥已经知道它自己的哈希值。我希望能够通过Key实例本身和UniqueValue引用键值对。由于哈希值已经知道,我可以用它来直接引用值吗?

例如,如果我有Key k1k2两个k1.UniqueValue = 2k2.UniqueValue = 5k1.NonUniqueValue = 42和{{}的实例1}},我希望能够引用k2.NonUniqueValue = 42中的值myMap只知道k1

这可以不直接修改k1.UniqueValue吗?

1 个答案:

答案 0 :(得分:0)

首先,一个小问题。您声明容器的方式:

std::unordered_map<Key*, Value, KeyHash> myMap

使地图键成为指针Key结构,而不是值。

现在,执行所需操作的最简单方法是重新组织哈希表:

std::unordered_map< unsigned int /*unique_part_of_key*/, std::pair<unsigned int /*non_unique_part_of_key*/, Value>>

要完全按照您的要求进行操作,您需要添加一个自定义KeyEqual谓词,忽略键的非唯一部分,就像您的KeyHash一样。然后,您可以使用随机的非唯一值创建一个假的Key实例,并使用它来检索所需的引用:

struct KeyEqual { bool operator(const Key& k1, const Key& k2) const { return k1.UniqueValue == k2.UniqueValue; } }; std::unordered_map<Key*, Value, KeyHash, KeyEqual> myMap{KeyHash(), KeyEqual()};