--- parser3/src/include/pa_hash.h 2007/05/18 12:44:00 1.67 +++ parser3/src/include/pa_hash.h 2007/12/28 11:23:20 1.69 @@ -17,7 +17,7 @@ #ifndef PA_HASH_H #define PA_HASH_H -static const char * const IDENT_HASH_H="$Date: 2007/05/18 12:44:00 $"; +static const char * const IDENT_HASH_H="$Date: 2007/12/28 11:23:20 $"; #include "pa_memory.h" #include "pa_types.h" @@ -34,6 +34,44 @@ static uint Hash_allocates[HASH_ALLOCATE 2097397, 4194103, 8388857, 16777447, 33554201, 67108961, 134217487, 268435697, 536870683, 1073741621, 2147483399}; +/// useful generic hash function +inline void generic_hash_code(uint& result, char c) { + result=(result<<4)+c; + if(uint g=(result&0xF0000000)) { + result=result^(g>>24); + result=result^g; + } +} +/// useful generic hash function +inline void generic_hash_code(uint& result, const char* s) { + while(char c=*s++) { + result=(result<<4)+c; + if(uint g=(result&0xF0000000)) { + result=result^(g>>24); + result=result^g; + } + } +} + +/// useful generic hash function +inline void generic_hash_code(uint& result, const char* buf, size_t size) { + const char* end=buf+size; + while(buf>24); + result=result^g; + } + } +} + +/// simple hash code of int. used by EXIF mapping +inline uint hash_code(int self) { + uint result=0; + generic_hash_code(result, (const char*)&self, sizeof(self)); + return result; +} + /** Simple hash. @@ -230,7 +268,7 @@ public: } /// returns exist key or not - bool contain(K key){ + bool contains(K key){ uint code=hash_code(key); uint index=code%allocated; for(Pair **ref=&refs[index]; *ref; ref=&(*ref)->link){ @@ -443,44 +481,6 @@ private: //disabled Hash& operator = (const Hash&) { return *this; } }; -/// useful generic hash function -inline void generic_hash_code(uint& result, char c) { - result=(result<<4)+c; - if(uint g=(result&0xF0000000)) { - result=result^(g>>24); - result=result^g; - } -} -/// useful generic hash function -inline void generic_hash_code(uint& result, const char* s) { - while(char c=*s++) { - result=(result<<4)+c; - if(uint g=(result&0xF0000000)) { - result=result^(g>>24); - result=result^g; - } - } -} - -/// useful generic hash function -inline void generic_hash_code(uint& result, const char* buf, size_t size) { - const char* end=buf+size; - while(buf>24); - result=result^g; - } - } -} - -/// simple hash code of int. used by EXIF mapping -inline uint hash_code(int self) { - uint result=0; - generic_hash_code(result, (const char*)&self, sizeof(self)); - return result; -} - /// Auto-object used to temporarily substituting/removing hash values template class Temp_hash_value {