Index: src/OFDoubleMatrix.m ================================================================== --- src/OFDoubleMatrix.m +++ src/OFDoubleMatrix.m @@ -222,17 +222,19 @@ OF_HASH_INIT(hash); for (i = 0; i < rows * columns; i++) { union { - double f; - uint64_t i; + double d; + uint8_t b[sizeof(double)]; } u; + uint8_t j; - u.f = data[i]; + u.d = of_bswap_double_if_be(data[i]); - OF_HASH_ADD_INT64(hash, u.i); + for (j = 0; j < sizeof(double); j++) + OF_HASH_ADD(hash, u.b[j]); } OF_HASH_FINALIZE(hash); return hash; Index: src/OFDoubleVector.m ================================================================== --- src/OFDoubleVector.m +++ src/OFDoubleVector.m @@ -209,17 +209,19 @@ OF_HASH_INIT(hash); for (i = 0; i < dimension; i++) { union { - double f; - uint64_t i; + double d; + uint8_t b[sizeof(double)]; } u; + uint8_t j; - u.f = data[i]; + u.d = of_bswap_double_if_be(data[i]); - OF_HASH_ADD_INT64(hash, u.i); + for (j = 0; j < sizeof(double); j++) + OF_HASH_ADD(hash, u.b[j]); } OF_HASH_FINALIZE(hash); return hash; Index: src/OFFloatMatrix.m ================================================================== --- src/OFFloatMatrix.m +++ src/OFFloatMatrix.m @@ -223,16 +223,18 @@ OF_HASH_INIT(hash); for (i = 0; i < rows * columns; i++) { union { float f; - uint32_t i; + uint8_t b[sizeof(float)]; } u; + uint8_t j; - u.f = data[i]; + u.f = of_bswap_float_if_be(data[i]); - OF_HASH_ADD_INT32(hash, u.i); + for (j = 0; j < sizeof(float); j++) + OF_HASH_ADD(hash, u.b[j]); } OF_HASH_FINALIZE(hash); return hash; Index: src/OFFloatVector.m ================================================================== --- src/OFFloatVector.m +++ src/OFFloatVector.m @@ -210,16 +210,18 @@ OF_HASH_INIT(hash); for (i = 0; i < dimension; i++) { union { float f; - uint32_t i; + uint8_t b[sizeof(float)]; } u; + uint8_t j; - u.f = data[i]; + u.f = of_bswap_float_if_be(data[i]); - OF_HASH_ADD_INT32(hash, u.i); + for (j = 0; j < sizeof(float); j++) + OF_HASH_ADD(hash, u.b[j]); } OF_HASH_FINALIZE(hash); return hash; Index: src/OFURL.m ================================================================== --- src/OFURL.m +++ src/OFURL.m @@ -363,19 +363,20 @@ { uint32_t hash; OF_HASH_INIT(hash); - 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_ADD_HASH(hash, [scheme hash]); + OF_HASH_ADD_HASH(hash, [host hash]); + OF_HASH_ADD(hash, (port & 0xFF00) >> 8); + OF_HASH_ADD(hash, port & 0xFF); + OF_HASH_ADD_HASH(hash, [user hash]); + OF_HASH_ADD_HASH(hash, [password hash]); + OF_HASH_ADD_HASH(hash, [path hash]); + OF_HASH_ADD_HASH(hash, [parameters hash]); + OF_HASH_ADD_HASH(hash, [query hash]); + OF_HASH_ADD_HASH(hash, [fragment hash]); OF_HASH_FINALIZE(hash); return hash; } Index: src/OFXMLAttribute.m ================================================================== --- src/OFXMLAttribute.m +++ src/OFXMLAttribute.m @@ -149,13 +149,13 @@ { uint32_t hash; OF_HASH_INIT(hash); - OF_HASH_ADD_INT32(hash, [name hash]); - OF_HASH_ADD_INT32(hash, [ns hash]); - OF_HASH_ADD_INT32(hash, [stringValue hash]); + OF_HASH_ADD_HASH(hash, [name hash]); + OF_HASH_ADD_HASH(hash, [ns hash]); + OF_HASH_ADD_HASH(hash, [stringValue hash]); OF_HASH_FINALIZE(hash); return hash; } Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -1151,19 +1151,19 @@ { uint32_t hash; OF_HASH_INIT(hash); - OF_HASH_ADD_INT32(hash, [name hash]); - OF_HASH_ADD_INT32(hash, [ns hash]); - OF_HASH_ADD_INT32(hash, [defaultNamespace hash]); - OF_HASH_ADD_INT32(hash, [attributes hash]); - OF_HASH_ADD_INT32(hash, [namespaces hash]); - OF_HASH_ADD_INT32(hash, [children hash]); - OF_HASH_ADD_INT32(hash, [characters hash]); - OF_HASH_ADD_INT32(hash, [CDATA hash]); - OF_HASH_ADD_INT32(hash, [comment hash]); + OF_HASH_ADD_HASH(hash, [name hash]); + OF_HASH_ADD_HASH(hash, [ns hash]); + OF_HASH_ADD_HASH(hash, [defaultNamespace hash]); + OF_HASH_ADD_HASH(hash, [attributes hash]); + OF_HASH_ADD_HASH(hash, [namespaces hash]); + OF_HASH_ADD_HASH(hash, [children hash]); + OF_HASH_ADD_HASH(hash, [characters hash]); + OF_HASH_ADD_HASH(hash, [CDATA hash]); + OF_HASH_ADD_HASH(hash, [comment hash]); OF_HASH_FINALIZE(hash); return hash; } Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -321,35 +321,17 @@ { \ 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); \ +#define OF_HASH_ADD_HASH(hash, other) \ + { \ + uint32_t otherCopy = other; \ + OF_HASH_ADD(hash, (otherCopy >> 24) & 0xFF); \ + OF_HASH_ADD(hash, (otherCopy >> 16) & 0xFF); \ + OF_HASH_ADD(hash, (otherCopy >> 8) & 0xFF); \ + OF_HASH_ADD(hash, otherCopy & 0xFF); \ } static OF_INLINE of_range_t of_range(size_t start, size_t length) {