hash of mpz_t and mpq_t

Hans Åberg haberg-1 at telia.com
Tue Jun 15 12:56:52 UTC 2021

> On 15 Jun 2021, at 10:25, Torbjörn Granlund <tg at gmplib.org> wrote:
> Mathieu Dutour <mathieu.dutour at gmail.com> writes:
>  would it be possible to have a hash function defined on
>  GMP integers and rationals?
>  This would be useful for building hash tables using gmp numeric.
> For mpz_t, have you considered using mpz_export to a byte vector and
> then hash that?
> And for mpq_t, the numref and denref with mpz_export?

For C++, with
  class integer { mpz_t value_; …}
I use:

namespace std {
  template<> struct hash<gmp::integer> {
    size_t operator()(gmp::integer const& x) const {
      std::size_t h = 0;
      for (int i = 0; i < abs(x.value_->_mp_size); ++i)
        h ^= std::hash<mp_limb_t>()(x.value_->_mp_d[i]);
      return h;

Possibly, it may not be stable because of calling GMP internals, so there might be a point in adding that.

More information about the gmp-discuss mailing list