diff options
Diffstat (limited to 'mpi-patches/add-mp-hash')
-rw-r--r-- | mpi-patches/add-mp-hash | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/mpi-patches/add-mp-hash b/mpi-patches/add-mp-hash index f2ae5f5f..63b137e9 100644 --- a/mpi-patches/add-mp-hash +++ b/mpi-patches/add-mp-hash @@ -1,22 +1,35 @@ Index: mpi-1.8.6/mpi.c =================================================================== ---- mpi-1.8.6.orig/mpi.c 2011-12-10 09:13:23.000000000 -0800 -+++ mpi-1.8.6/mpi.c 2011-12-10 12:03:30.000000000 -0800 -@@ -1960,6 +1960,21 @@ +--- 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) +{ -+ unsigned long hash; -+ mp_digit d = DIGIT(a, 0); +#if SIZEOF_LONG > MP_DIGIT_SIZE ++ unsigned long hash; + int ix; -+ for (ix = 0; ix < SIZEOF_LONG / MP_DIGIT_SIZE && ix < USED(a); ix++) { -+ hash = (hash << MP_DIGIT_BIT) | DIGIT(a, 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 -+ hash = d; ++ 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; +} @@ -26,8 +39,8 @@ Index: mpi-1.8.6/mpi.c Index: mpi-1.8.6/mpi.h =================================================================== ---- mpi-1.8.6.orig/mpi.h 2011-12-10 09:13:23.000000000 -0800 -+++ mpi-1.8.6/mpi.h 2011-12-10 12:03:23.000000000 -0800 +--- 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); |