Index: mpi-1.8.6/mpi.c =================================================================== --- mpi-1.8.6.orig/mpi.c 2012-04-05 16:26:22.206340007 -0700 +++ mpi-1.8.6/mpi.c 2012-04-09 08:59:09.673643507 -0700 @@ -1960,6 +1960,34 @@ /* }}} */ +unsigned long mp_hash(mp_int *a) +{ +#if SIZEOF_LONG > MP_DIGIT_SIZE + unsigned long hash; + int ix; + + if (USED(a) >= 2 * SIZEOF_LONG / MP_DIGIT_SIZE) { + unsigned long omega = 0; + unsigned long alpha = 0; + for (ix = 0; ix < SIZEOF_LONG / MP_DIGIT_SIZE; ix++) + omega = (omega << MP_DIGIT_BIT) | DIGIT(a, ix); + for (ix = USED(a) - SIZEOF_LONG / MP_DIGIT_SIZE; ix < USED(a); ix++) + alpha = (alpha << MP_DIGIT_BIT) | DIGIT(a, ix); + hash = alpha + omega; + } else { + hash = 0; + + for (ix = 0; ix < USED(a); ix++) + hash = (hash << MP_DIGIT_BIT) | DIGIT(a, ix); + } +#else + mp_digit omega = DIGIT(a, 0); + mp_digit alpha = DIGIT(a, USED(a) - 1); + unsigned long hash = alpha + omega; +#endif + return SIGN(a) == MP_NEG ? ~hash : hash; +} + /*------------------------------------------------------------------------*/ /* {{{ Number theoretic functions */ Index: mpi-1.8.6/mpi.h =================================================================== --- mpi-1.8.6.orig/mpi.h 2012-04-05 16:26:22.206340007 -0700 +++ mpi-1.8.6/mpi.h 2012-04-09 08:58:17.100087507 -0700 @@ -165,6 +165,8 @@ int mp_isodd(mp_int *a); int mp_iseven(mp_int *a); +unsigned long mp_hash(mp_int *a); + /*------------------------------------------------------------------------*/ /* Number theoretic */