Index: src/OFDate.m ================================================================== --- src/OFDate.m +++ src/OFDate.m @@ -302,23 +302,12 @@ { uint32_t hash; OF_HASH_INIT(hash); - OF_HASH_ADD(hash, (seconds >> 56) & 0xFF); - OF_HASH_ADD(hash, (seconds >> 48) & 0xFF); - OF_HASH_ADD(hash, (seconds >> 40) & 0xFF); - OF_HASH_ADD(hash, (seconds >> 32) & 0xFF); - OF_HASH_ADD(hash, (seconds >> 24) & 0xFF); - OF_HASH_ADD(hash, (seconds >> 16) & 0xFF); - OF_HASH_ADD(hash, (seconds >> 8) & 0xFF); - OF_HASH_ADD(hash, seconds & 0xFF); - - OF_HASH_ADD(hash, (microseconds >> 24) & 0xFF); - OF_HASH_ADD(hash, (microseconds >> 16) & 0xFF); - OF_HASH_ADD(hash, (microseconds >> 8) & 0xFF); - OF_HASH_ADD(hash, microseconds & 0xFF); + OF_HASH_ADD_INT64(hash, seconds); + OF_HASH_ADD_INT32(hash, microseconds); OF_HASH_FINALIZE(hash); return hash; } Index: src/OFURL.m ================================================================== --- src/OFURL.m +++ src/OFURL.m @@ -30,17 +30,10 @@ #import "OFInvalidFormatException.h" #import "OFOutOfMemoryException.h" #import "macros.h" -#define ADD_STR_HASH(str) \ - tmp = [str hash]; \ - OF_HASH_ADD(hash, tmp >> 24); \ - OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); \ - OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); \ - OF_HASH_ADD(hash, tmp & 0xFF); - static OF_INLINE OFString* resolve_relative_path(OFString *path) { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFMutableArray *array; @@ -363,26 +356,23 @@ return YES; } - (uint32_t)hash { - uint32_t hash, tmp; + uint32_t hash; OF_HASH_INIT(hash); - ADD_STR_HASH(scheme); - ADD_STR_HASH(host); - - OF_HASH_ADD(hash, (port >> 8) & 0xFF); - OF_HASH_ADD(hash, port & 0xFF); - - ADD_STR_HASH(user); - ADD_STR_HASH(password); - ADD_STR_HASH(path); - ADD_STR_HASH(parameters); - ADD_STR_HASH(query); - ADD_STR_HASH(fragment); + OF_HASH_ADD_INT32(hash, [scheme hash]); + OF_HASH_ADD_INT32(hash, [host hash]); + OF_HASH_ADD_INT16(hash, port); + OF_HASH_ADD_INT32(hash, [user hash]); + OF_HASH_ADD_INT32(hash, [password hash]); + OF_HASH_ADD_INT32(hash, [path hash]); + OF_HASH_ADD_INT32(hash, [parameters hash]); + OF_HASH_ADD_INT32(hash, [query hash]); + OF_HASH_ADD_INT32(hash, [fragment hash]); OF_HASH_FINALIZE(hash); return hash; } Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -248,6 +248,32 @@ #define OF_HASH_FINALIZE(hash) \ { \ hash += (hash << 3); \ hash ^= (hash >> 11); \ hash += (hash << 15); \ + } +#define OF_HASH_ADD_INT16(hash, int16) \ + { \ + uint16_t int16Copy = int16; \ + OF_HASH_ADD(hash, int16Copy >> 8); \ + OF_HASH_ADD(hash, int16Copy & 0xFF); \ + } +#define OF_HASH_ADD_INT32(hash, int32) \ + { \ + uint32_t int32Copy = int32; \ + OF_HASH_ADD(hash, (int32Copy >> 24) & 0xFF); \ + OF_HASH_ADD(hash, (int32Copy >> 16) & 0xFF); \ + OF_HASH_ADD(hash, (int32Copy >> 8) & 0xFF); \ + OF_HASH_ADD(hash, int32Copy & 0xFF); \ + } +#define OF_HASH_ADD_INT64(hash, int64) \ + { \ + uint64_t int64Copy = int64; \ + OF_HASH_ADD(hash, (int64Copy >> 56) & 0xFF); \ + OF_HASH_ADD(hash, (int64Copy >> 48) & 0xFF); \ + OF_HASH_ADD(hash, (int64Copy >> 40) & 0xFF); \ + OF_HASH_ADD(hash, (int64Copy >> 32) & 0xFF); \ + OF_HASH_ADD(hash, (int64Copy >> 24) & 0xFF); \ + OF_HASH_ADD(hash, (int64Copy >> 16) & 0xFF); \ + OF_HASH_ADD(hash, (int64Copy >> 8) & 0xFF); \ + OF_HASH_ADD(hash, int64Copy & 0xFF); \ }