From 64ee91ff842aa42160eb7a22c96049aab86d39ab Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Thu, 16 Jun 2005 21:03:13 +0000 Subject: [PATCH] Added hash functions for 64-bit integers. hash_pointer() now uses either 32-bit or 64-bit hash depending on pointer size. hashtable.h with an atomic key does the same. --- lib/hash-test.c | 2 +- lib/hashfunc.h | 5 +++-- lib/hashtable.h | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/hash-test.c b/lib/hash-test.c index af4c7154..31af3c0f 100644 --- a/lib/hash-test.c +++ b/lib/hash-test.c @@ -171,7 +171,7 @@ struct node4 { #define HASH_GIVE_HASHFN static uns test4_hash(char *host, int port) { - return hash_string_nocase(host) ^ hash_int(port); + return hash_string_nocase(host) ^ hash_u32(port); } #define HASH_GIVE_EQ diff --git a/lib/hashfunc.h b/lib/hashfunc.h index 17a865b1..c10f2249 100644 --- a/lib/hashfunc.h +++ b/lib/hashfunc.h @@ -39,7 +39,8 @@ uns hash_string_nocase(const byte *str) CONST; * of using shifts and adds on architectures where multiplication * instructions are slow). */ -static inline uns CONST hash_int(uns x) { return 0x01008041*x; } -static inline uns CONST hash_pointer(void *x) { return hash_int((uns)(addr_int_t)x); } +static inline uns CONST hash_u32(uns x) { return 0x01008041*x; } +static inline uns CONST hash_u64(u64 x) { return hash_u32((uns)x ^ (uns)(x >> 32)); } +static inline uns CONST hash_pointer(void *x) { return ((sizeof(x) <= 4) ? hash_u32((uns)(addr_int_t)x) : hash_u64((u64)(addr_int_t)x)); } #endif diff --git a/lib/hashtable.h b/lib/hashtable.h index 549eca82..2893e998 100644 --- a/lib/hashtable.h +++ b/lib/hashtable.h @@ -185,7 +185,7 @@ struct P(table) P(table); #ifndef HASH_GIVE_HASHFN # define HASH_GIVE_HASHFN static inline int P(hash) (TAUC HASH_ATOMIC_TYPE x) - { return hash_int(x); } + { return ((sizeof(x) <= 4) ? hash_u32(x) : hash_u64(x)); } #endif #ifndef HASH_GIVE_EQ -- 2.39.2