Mam wcześniej kod tylko Mac, który generuje sumę kontrolną przy użyciu std::hash<std::string> [1]. Teraz ten kod jest przenoszony do systemu Windows. Podczas gdy kompilacja Mac wykorzystuje Clang, port Windows jest skompilowany z GCC G ++. Aby się spodziewać (z {X1}} uzależnione od wdrożenia), wynik obu kompilatorów różni się:

# 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

Jak dowiedzieć się, jaki algorytm używają moich kompilatorów?

Jedynym rozwiązaniem, o którym mogę pomyśleć, jest sondowanie wszystkich wdrażania funkcji Hash na niektórych ciągach testowych i zobaczyć, które pasują do ...

Długoterminowe podejście do tego jest używanie identycznych funkcji Hash kryptograficznych w obu portach. Ale w tej chwili nie jest to możliwe, aby ponownie obliczyć wszystkie sprawdzanie, które zostały utworzone do tej pory w wersji MAC i które muszą być weryfikowalne przez port Windows.


std::hash
0
z80crew 2 kwiecień 2020, 16:30

1 odpowiedź

Najlepsza odpowiedź

Jak powiedziałeś, używając std::hash dla tej funkcjonalności był prawdopodobnie zły wybór. Nie tylko to nie tylko platforma, ale implementacje mogą zmienić sposób, w jaki mieszają rzeczy przed zwolnieniem do wydania. W rzeczywistości, jak wskazuje @johnFilleau, nie muszą nawet być taka sama dla różnych programów.

Aby bezpośrednio odpowiedzieć na pytanie, wdrożenia Hash nie są częścią kompilatora, ale raczej częścią standardowej realizacji biblioteki. Na komputerze Mac prawie na pewno korzystasz z libc ++, a wdrożenie hasha jest Oto. W systemie Windows powinieneś być w stanie znaleźć wdrożenie Tutaj.

Dla obu tych, musisz zrobić więcej wyszukiwania - to tylko punkty wyjścia.

3
Marshall Clow 2 kwiecień 2020, 13:43