diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2006-10-04 20:28:41 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2006-10-04 20:28:41 (GMT) |
commit | 3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e (patch) | |
tree | d2526ce0c99b1f268769fd8bd1c56e6dda83fd7f /src/objcache.cpp | |
parent | c844985adde0459f1f01ed00d0a289591fbcd2af (diff) | |
download | Doxygen-3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e.zip Doxygen-3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e.tar.gz Doxygen-3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e.tar.bz2 |
Release-1.4.7-20061004
Diffstat (limited to 'src/objcache.cpp')
-rw-r--r-- | src/objcache.cpp | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/objcache.cpp b/src/objcache.cpp index c192504..63e7eb7 100644 --- a/src/objcache.cpp +++ b/src/objcache.cpp @@ -176,16 +176,31 @@ void ObjCache::moveToFront(int index) unsigned int ObjCache::hash(void *addr) { - // Thomas Wang's 32 bit Mix Function + static bool isPtr64 = sizeof(addr)==8 && sizeof(long)==8; - // TODO: what if sizeof(void*)!=4 ? - unsigned int key = (unsigned int)addr; - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); + unsigned long key = (unsigned long)addr; + if (isPtr64) + { + // Thomas Wang's 64 bit Mix Function + key += ~(key << 32); + key ^= (key >> 22); + key += ~(key << 13); + key ^= (key >> 8); + key += (key << 3); + key ^= (key >> 15); + key += ~(key << 27); + key ^= (key >> 31); + } + else + { + // Thomas Wang's 32 bit Mix Function + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + } return key & (m_size-1); } |