Commit 86210f13 by Andi Kleen Committed by Andi Kleen

Improve pointer hash function to include all bits

The hashtab pointer hash function is not very good. It throws most of the
bits in the pointer away.

This changes pointer_hash to use the mix code from jhash function that mixes
all the bits on the pointer and makes them dependent on each other, before doing
the modulo.

libiberty/:

2013-04-22  Andi Kleen <ak@linux.intel.com>

	* hashtab.c (hash_pointer): Move to end of file and reimplement.

From-SVN: r198171
parent 7441bd3d
2013-04-22 Andi Kleen <ak@linux.intel.com>
* hashtab.c (hash_pointer): Move to end of file and reimplement.
2013-04-03 Jason Merrill <jason@redhat.com>
* cp-demangle.c (cplus_demangle_type): Fix function quals.
......
......@@ -194,14 +194,6 @@ higher_prime_index (unsigned long n)
return low;
}
/* Returns a hash code for P. */
static hashval_t
hash_pointer (const PTR p)
{
return (hashval_t) ((intptr_t)p >> 3);
}
/* Returns non-zero if P1 and P2 are equal. */
static int
......@@ -988,3 +980,28 @@ iterative_hash (const PTR k_in /* the key */,
/*-------------------------------------------- report the result */
return c;
}
/* Returns a hash code for pointer P. Simplified version of evahash */
static hashval_t
hash_pointer (const PTR p)
{
intptr_t v = (intptr_t) p;
unsigned a, b, c;
a = b = 0x9e3779b9;
if (sizeof (intptr_t) == 4)
{
/* Mix as 16bit for now */
a += v >> 16;
b += v & 0xffff;
}
else
{
a += v >> 32;
b += v & 0xffffffff;
}
c = 0x42135234;
mix (a, b, c);
return c;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment