these tests require gmpy and test the limits of the 32bit build the limits of the 64bit build are so large that they cannot be tested on accessible hardware hash values to use for positive and negative infinities and nans pyhash10inv is the inverse of 10 modulo the prime pyhashmodulus these tests require gmpy and test the limits of the 32 bit build the limits of the 64 bit build are so large that they cannot be tested on accessible hardware hash values to use for positive and negative infinities and nans _pyhash_10inv is the inverse of 10 modulo the prime _pyhash_modulus
import sys
from decimal import *
from gmpy import mpz


_PyHASH_MODULUS = sys.hash_info.modulus

_PyHASH_INF = sys.hash_info.inf
_PyHASH_NAN = sys.hash_info.nan


_PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)

def xhash(coeff, exp):
    sign = 1
    if coeff < 0:
        sign = -1
        coeff = -coeff
    if exp >= 0:
        exp_hash = pow(10, exp, _PyHASH_MODULUS)
    else:
        exp_hash = pow(_PyHASH_10INV, -exp, _PyHASH_MODULUS)
    hash_ = coeff * exp_hash % _PyHASH_MODULUS
    ans = hash_ if sign == 1 else -hash_
    return -2 if ans == -1 else ans


x = mpz(10) ** 425000000 - 1
coeff = int(x)

d = Decimal('9' * 425000000 + 'e-849999999')

h1 = xhash(coeff, -849999999)
h2 = hash(d)

assert h2 == h1