获取unordered_set哈希值并且它是常量

时间:2015-12-13 02:25:55

标签: c++ hash unordered-set

是否可以找到unordered_set中元素的哈希值(哈希键)?

例如;

unordered_set<string> errorStates;
errorStates.insert("File does not exist");

// Can I get the hash of this key?
int ERR_FILE_NOT_EXISTS = errorStates.keyHash("File does not exist");

File does not exist的哈希值是否也一样?如果我运行我的程序并将20个值插入errorStates并且当我运行程序并插入200时哈希是否相同?想法是哈希将是唯一的错误ID并将哈希写入文件。

我正在创建一个Status类,以便轻松地从函数返回错误/成功结果,并从错误代码中获取错误消息 - 请参阅下面的部分实现。但也许还有更合适的方式?

//usage
Status evtState = onMouseMove();
Status copyState = fileCopy();

class Status
{
public:
    static STATE registerState(const tstring &stateMsg)
    {
        states.emplace(stateMsg);
        return states.hashValue(stateMsg);
    }

    Status(const STATE &state) : state(state) {}
    ~Status() {}

    string toString() 
    {
        unordered_set<tstring>::const_iterator ele = states.find(state);

        return (ele != states.end()) ? *ele : "Undefined";
    }

    ostream& operator<<(Status& obj) 
    {
        return cout << obj.toString();
    }

private:
    static unordered_set<tstring> states;

    const STATE state;
};

2 个答案:

答案 0 :(得分:2)

可以从std::unordered_set检索哈希函数,并使用它来查找密钥的哈希值。

size_t h = myset.hash_function()("hello world");
  

如果我运行程序并将20个值插入errorStates并且运行程序并插入200时哈希是否相同?

std::unordered_set<T>的默认哈希函数为std::hash<T>。此类模板的一个要求是:

  

返回的值仅取决于参数k   计划的持续时间。 [注:因此所有的评价   具有相同k值的表达式h(k)产生与a相同的结果   执行程序。 - 后注]

hstd::hash<T>kT

我对此的解释是,在程序的任何单次执行中,特定键的哈希值都是相同的。但是,在一系列运行中,表达式h(k)不需要相同。

因此,插入的值的数量不会仅在一个特定的执行中更改键的哈希值,。您不能假设密钥的哈希值在多次执行时保持不变。

答案 1 :(得分:1)

  

我可以获取此密钥的哈希值吗?

不确定

size_t hashval = errorState.hash_function()("File does not exist");
  

File的哈希值是否总是不一样?如果我运行我的程序并将20个值插入errorStates并且当我运行程序并插入200时哈希是否相同?

它不会在程序的一次运行中发生变化。向std::set添加数千个元素不会更改任何键的哈希值。但是,如果再次运行相同的程序,则哈希值可能不同(q.v.哈希随机化)。如果您在不同的计算机上运行程序,或者甚至使用不同的标准库实现...

  

这个想法是散列将是唯一的错误id并将散列写入文件。

由于两个原因,它不会起作用:

  1. 如上所述,在同一程序的两个不同执行中,散列值可能不同。所以不应该坚持下去。

  2. 哈希值不是唯一的。完全可能(并且非常常见)两个不同的键具有相同的散列值。这被称为&#34;哈希冲突&#34;。 (参见&#34;生日悖论&#34;)。