Index: mpi-1.8.6/mpi.c =================================================================== --- mpi-1.8.6.orig/mpi.c 2012-03-04 08:51:51.607484757 -0800 +++ mpi-1.8.6/mpi.c 2012-03-04 11:49:32.456841257 -0800 @@ -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) { + mp_digit omega = 0; + mp_digit 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-03-04 08:51:51.607484757 -0800 +++ mpi-1.8.6/mpi.h 2012-03-04 11:49:32.196695007 -0800 @@ -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 */