Как узнать алгоритм спецификации c, который мой компилятор C ++ использует для std :: ha sh? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть ранее Ma c -одный код, который генерирует контрольную сумму, используя std::hash<std::string> [1]. Теперь этот код портирован на Windows. Хотя сборка Ma c использует CLANG, порт Windows скомпилирован с G CC g ++. Как и следовало ожидать (если std::hash зависит от реализации), результаты обоих компиляторов различаются:

# Windows: g++.exe (Rev2, Built by MSYS2 project) 9.2.0
std::hash("hello world"): 5577293430985752569
# Mac: Apple clang version 11.0.3 (clang-1103.0.32.29)
std::hash("hello world"): 12386028635079221413

Как узнать, какой алгоритм используют мои компиляторы?

Единственное решение, которое я могу придумать, - это проверить все реализации функций ha sh на некоторых тестовых строках и посмотреть, какие из них соответствуют ...

Долгосрочный подход для этого заключается в использовании идентичных cryptographi c ha sh работает в обоих портах, конечно. Но в настоящее время невозможно пересчитать все контрольные суммы, которые были созданы на данный момент версией Ma c и которые должны проверяться портом Windows.


[1] Да использование std::hash для этой задачи было плохим выбором.

1 Ответ

3 голосов
/ 02 апреля 2020

Как вы сказали, использование std::hash для этой функции, вероятно, было плохим выбором. Мало того, что это не кроссплатформенность, но реализации могут изменить то, как они sh вещи от выпуска к выпуску. На самом деле, как указывает @JohnFilleau, они не обязательно должны быть одинаковыми для разных прогонов программы.

Чтобы ответить на ваш вопрос напрямую, реализации ha sh не являются частью компилятора, а скорее частью стандартная реализация библиотеки. На Ma c вы почти наверняка используете libc ++, а реализация ha sh здесь здесь . На Windows вы сможете найти реализацию здесь .

Для того и другого вам потребуется выполнить дополнительный поиск - это только отправная точка.

...