From 511293d580d9ff6f172c5d24af6cb61a66c0a6d4 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Thu, 17 Mar 2022 23:03:04 +0100 Subject: [PATCH] Provide example of hash function --- example/ex-multi02.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/example/ex-multi02.c b/example/ex-multi02.c index 3dea0805..765a1d9d 100644 --- a/example/ex-multi02.c +++ b/example/ex-multi02.c @@ -8,11 +8,33 @@ #include "m-dict.h" #include "m-array.h" +// GMP doesn't provide a fast hash function. +static inline size_t +mpz_hash(const mpz_t z) +{ + mp_size_t n = z->_mp_size; + mp_limb_t *p = z->_mp_d; + M_HASH_DECL(hash); + + if (n <= 0) { + M_HASH_UP (hash, 0x7F5C1458); + if (n == 0) { + return M_HASH_FINAL (hash); + } + n = -n; + } + while (n-- > 0) { + M_HASH_UP (hash, *p++); + } + return M_HASH_FINAL (hash); +} + /* Define the OPLIST of a mpz_t and register it globally */ #define M_OPL_mpz_t() \ (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear), \ EQUAL( API( mpz_cmp, EQ(0), ARG1, ARG2)), \ CMP(mpz_cmp), \ + HASH(mpz_hash), \ OUT_STR( API( mpz_out_str, VOID, ARG1, 10, ARG2)), \ IN_STR( API( mpz_inp_str, GT(0), ARG1, ARG2, 10)), \ TYPE(mpz_t) )