2015-12-13 1 views
0

Можно ли узнать значение хэша (хешированный ключ) для элемента в 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? Идея заключается в том, что хэш будет уникальным идентификатором ошибки и записывает хэш в файл.

Я создаю класс 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; 
}; 
+1

'Можно ли узнать значение хэша (хешированный ключ) для элемента в неупорядоченном_set'? Конечно: 'my_set.hash_function() (element)'. –

+0

@IgorTandetnik Спасибо, что отвечает на одну часть. Будет ли хэш всегда постоянным? Независимо от размера набора, OS 32 бит или 64 бит? –

+0

'Также будет ли хэш всегда одинаковым?' Это лучше. Как бы набор мог найти какой-либо элемент, если его хэш продолжает меняться? Это было бы не очень хэш-функция, а скорее генератор случайных чисел. –

ответ

1

можно получить хэш-функции от std::unordered_set и использовать его, чтобы найти значение хэш-ключа.

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

ли хэш будет таким же, если я запускаю свою программу и вставить 20 значений в errorStates и когда я запускаю программу и вставить 200?

Хеш-функция по умолчанию для std::unordered_set<T> - std::hash<T>. В одном из требований для этого шаблона класса указано:

Возвращаемое значение должно зависеть только от аргумента k для длины программы . [Примечание: Таким образом, все оценки выражения h (k) с тем же значением для k дают одинаковый результат для при выполнении программы. -end примечание]

С h будучи std::hash<T> и k будучи T.

Мое объяснение заключается в том, что при любом выполнении программы хеш-значение для конкретного ключа будет одинаковым. Однако в течение последовательности прогонов выражение h(k) не обязательно должно быть одинаковым.

Поэтому количество вставленных значений не изменит хеш-значение ключа, , но только в одном конкретном исполнении. Вы не можете предположить, что хеш-значение ключа останется неизменным при нескольких исполнениях.

1

Могу ли я получить хэш этого ключа?

Sure:

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

ли хэш для файла не существует всегда быть такой же? Будет ли хэш одинаковым, если я запустил свою программу и вставляю 20 значений в errorStates и когда запускаю программу и вставляю 200?

Он не изменится за один проход программы. Добавление тысяч других элементов в std::set не изменит хэш-значение для любой клавиши. Однако, если вы снова запустите одну и ту же программу, хеш-значения могут отличаться (q.v. хэш-рандомизация). И если вы запускаете программу на другой машине или даже с другой реализацией стандартной библиотеки ...

Идея хэш будет уникальным идентификатором ошибки и записывает хэш в файл.

Это не будет работать по двум причинам:

  1. Как уже упоминалось выше, хэш-значения могут быть различными в двух различных выполнений одной и той же программы. Поэтому они не должны сохраняться.

  2. Хеш-значения не уникальны. Вполне возможно (и довольно часто) для двух разных ключей иметь одно и то же значение хэш-функции. Это называется «хеш-столкновение». (См. «Парадокс дня рождения»).

Смежные вопросы