Iter 2: Reusable, robust c++ std::hash for GMP's big integer type
Make functions that should not be exported static
Functions that should only be available locally should be marked static. This applies to pi_size_t() and scramble() in hash_mpz.cpp.
Avoid using std::endl
Use &quot;\n&quot; instead of std::endl, the latter is equivalent to &quot;\n&quot;, but also forces a flush of the output. This is rarely necessary, and might hurt performance, especially when writing to a file, or when standard output is redirected to a file.
Consider not using namespace std
It's very good that you are not using namespace std in the header files. But consider not using it at all, since even if only used in .cpp files it can result in namespace conflicts that are hard to debug. If you do find yourself typing std:: a lot and want to avoid it, consider only importing the names that you do use from std::, like so:
using std::cout;
using std::unordered_map;

Final nitpicks

There's still one unnecessary std:: inside the namespace std block in hash_mpz.cpp.
You don't need return 0 at the end of main().