New, better hash for floating point and complex

This commit is contained in:
Guido van Rossum 1997-01-11 19:26:21 +00:00
parent 265b5b3f03
commit 919cf1aff1
2 changed files with 41 additions and 6 deletions

View file

@ -236,9 +236,16 @@ float_hash(v)
x = (long)intpart;
}
else {
/* Note -- if you change this code, also change the copy
in complexobject.c */
long hipart;
fractpart = frexp(fractpart, &expo);
fractpart = fractpart*2147483648.0; /* 2**31 */
x = (long) (intpart + fractpart) ^ expo; /* Rather arbitrary */
fractpart = fractpart * 2147483648.0; /* 2**31 */
hipart = (long)fractpart; /* Take the top 32 bits */
fractpart = (fractpart - (double)hipart) * 2147483648.0;
/* Get the next 32 bits */
x = hipart + (long)fractpart + (long)intpart + (expo << 15);
/* Combine everything */
}
if (x == -1)
x = -2;