diff options
author | Matthew Dempsky <mdempsky@google.com> | 2013-07-08 17:47:57 (GMT) |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2013-07-08 17:49:49 (GMT) |
commit | e0e12debf82124012ba84e13fe6662c812bba8b1 (patch) | |
tree | fa5e8701d0151ed38004e0c61fbd3532bbc2e98e /src/build_log.cc | |
parent | 1f7fa18dea3a57653811f75072871da08d1cff7b (diff) | |
download | Ninja-e0e12debf82124012ba84e13fe6662c812bba8b1.zip Ninja-e0e12debf82124012ba84e13fe6662c812bba8b1.tar.gz Ninja-e0e12debf82124012ba84e13fe6662c812bba8b1.tar.bz2 |
Fix murmur hash implementations to work on strict alignment
architectures like OpenBSD/mips64el and OpenBSD/hppa64.
Diffstat (limited to 'src/build_log.cc')
-rw-r--r-- | src/build_log.cc | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/build_log.cc b/src/build_log.cc index 6b73002..a040ce2 100644 --- a/src/build_log.cc +++ b/src/build_log.cc @@ -54,26 +54,27 @@ uint64_t MurmurHash64A(const void* key, size_t len) { const uint64_t m = BIG_CONSTANT(0xc6a4a7935bd1e995); const int r = 47; uint64_t h = seed ^ (len * m); - const uint64_t * data = (const uint64_t *)key; - const uint64_t * end = data + (len/8); - while (data != end) { - uint64_t k = *data++; + const unsigned char * data = (const unsigned char *)key; + while (len >= 8) { + uint64_t k; + memcpy(&k, data, sizeof k); k *= m; k ^= k >> r; k *= m; h ^= k; h *= m; + data += 8; + len -= 8; } - const unsigned char* data2 = (const unsigned char*)data; switch (len & 7) { - case 7: h ^= uint64_t(data2[6]) << 48; - case 6: h ^= uint64_t(data2[5]) << 40; - case 5: h ^= uint64_t(data2[4]) << 32; - case 4: h ^= uint64_t(data2[3]) << 24; - case 3: h ^= uint64_t(data2[2]) << 16; - case 2: h ^= uint64_t(data2[1]) << 8; - case 1: h ^= uint64_t(data2[0]); + case 7: h ^= uint64_t(data[6]) << 48; + case 6: h ^= uint64_t(data[5]) << 40; + case 5: h ^= uint64_t(data[4]) << 32; + case 4: h ^= uint64_t(data[3]) << 24; + case 3: h ^= uint64_t(data[2]) << 16; + case 2: h ^= uint64_t(data[1]) << 8; + case 1: h ^= uint64_t(data[0]); h *= m; }; h ^= h >> r; |