Дает ли std :: hash одинаковый результат для одного и того же ввода для разных скомпилированных сборок и разных машин? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть несколько случайных тестовых параметров, для которых мне нужно вычислить хеш, чтобы определить, выполнялся ли я с теми же параметрами. Я мог бы запустить тест с использованием того же источника, перекомпилированного в другое время, или запустить на другом компьютере.

Несмотря на это, я хочу определить, использовались ли те же параметры для прогона. Дает ли std::hash одинаковый результат для одного и того же ввода для разных скомпилированных сборок и разных машин?

, например

std::hash<string>{}("TestcaseParamVal0.7Param0.4");

Всегда ли это будет уникальный номер?

1 Ответ

0 голосов
/ 03 июля 2018

Нет, std::hash не гарантирует, что результат будет одинаковым на всех компьютерах, сборках или даже выполнениях одной и той же сборки на одном компьютере. Ваша единственная гарантия состоит в том, что во время одного выполнения равные объекты имеют одинаковый хэш. (Конечно, нет никакой гарантии, что объекты, которые неравны, имеют разные хэши.)

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

Если вам нужна повторяемость между запусками и машинами, вы не можете использовать std::hash и должны развернуть свой собственный эквивалент.

...