23 if constexpr (
sizeof(uint64_t) !=
sizeof(
unsigned long)) {
24 uint32_t hi =
static_cast<uint32_t
>(op >> 32);
25 uint32_t lo =
static_cast<uint32_t
>(op);
27 mpz_mul_2exp(rop, rop, 32);
28 mpz_add_ui(rop, rop, lo);
36 if (mp_bits_per_limb == 64) {
37 mp_limb_t limb = mpz_getlimbn(op, 0);
40 assert(mp_bits_per_limb == 32);
41 assert(mpz_size(op) >= 1);
42 uint64_t limb_lo =
static_cast<uint64_t
>(mpz_getlimbn(op, 0));
44 if (mpz_size(op) >= 2) {
45 limb_hi =
static_cast<uint64_t
>(mpz_getlimbn(op, 1));
47 return (limb_hi << 32) | limb_lo;
51 if (
sizeof(mp_bitcnt_t) == 4)
53 uint32_t hi =
static_cast<uint32_t
>(op >> 32);
54 uint32_t lo =
static_cast<uint32_t
>(op);
55 mpz_init_set_ui(rop, hi);
56 mpz_mul_2exp(rop, rop, 32);
57 mpz_add_ui(rop, rop, lo);
60 mpz_init_set_ui(rop, op);
73 if (
sizeof(mp_bitcnt_t) == 4)
75 int32_t hi =
static_cast<int32_t
>(op >> 32);
76 int32_t lo =
static_cast<int32_t
>(op);
77 mpz_init_set_si(rop, hi);
78 mpz_mul_2exp(rop, rop, 32);
79 mpz_add_ui(rop, rop, lo);
82 mpz_init_set_si(rop, op);
86size_t mpz_hash(
const mpz_t op, uint64_t start) {
87 uint64_t i, j = 0, n, res = start;
92 for (i = 0, j = 0, n = mpz_size(op); i < n; ++i) {
93 p0 = hash::s_hash_primes[j++];
94 if (j == hash::s_n_primes)
96 p1 = hash::s_hash_primes[j++];
97 if (j == hash::s_n_primes)
99 limb = mpz_getlimbn(op, i);
100 if (mp_bits_per_limb == 64) {
102 uint64_t hi = (limb >> 32);
104 x = ((x >> 16) ^ x) * p0;
105 x = ((x >> 16) ^ x) * p1;
107 p0 = hash::s_hash_primes[j++];
108 if (j == hash::s_n_primes)
110 p1 = hash::s_hash_primes[j++];
111 if (j == hash::s_n_primes)
116 assert(mp_bits_per_limb == 32);
119 x = ((x >> 16) ^ x) * p0;
120 x = ((x >> 16) ^ x) * p1;
121 res = ((x >> 16) ^ x);