得到unordered_set个hash值并且是常量

Get unordered_set hash value and is it constant

是否可以找出 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 class 以轻松 return error/success 函数的结果并从错误代码中获取错误消息 - 请参阅下面的部分实现.但也许有更好更合适的方式?

//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;
};

可以从 std::unordered_set 中检索散列函数并使用它来查找键的散列值。

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

Would the hash be the same if I run my program and insert 20 values into errorStates and when I run the program and insert 200?

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

The value returned shall depend only on the argument k for the duration of the program. [Note: Thus all evaluations of the expression h(k) with the same value for k yield the same result for a given execution of the program. —end note ]

hstd::hash<T>kT

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

因此插入的值的数量不会改变键的散列值,只会在一次特定的执行中。您不能假设一个键的哈希值在多次执行后会保持不变。

Can I get the hash of this key?

当然可以:

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

Would the hash for File does not exist always be the same? Would the hash be the same if I run my program and insert 20 values into errorStates and when I run the program and insert 200?

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

The idea is the hash will be the unique error id and write the hash to a file.

这行不通有两个原因:

  1. 如前所述,同一程序的两次不同执行中的哈希值可能不同。所以他们不应该被持久化。

  2. 哈希值不唯一。两个不同的密钥完全有可能(并且很常见)具有相同的哈希值。这叫做"hash collision"。 (参见 "birthday paradox")。