diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2006-10-04 20:28:41 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2006-10-04 20:28:41 (GMT) |
commit | ca720513ae89ad82fd8d8c4340271375ae1e9f64 (patch) | |
tree | d2526ce0c99b1f268769fd8bd1c56e6dda83fd7f /src/objcache.cpp | |
parent | b1dbef9886c3bf49050a5f49b9ae9d12021e4b50 (diff) | |
download | Doxygen-ca720513ae89ad82fd8d8c4340271375ae1e9f64.zip Doxygen-ca720513ae89ad82fd8d8c4340271375ae1e9f64.tar.gz Doxygen-ca720513ae89ad82fd8d8c4340271375ae1e9f64.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); } |