| /* | |
| Copyright (c) 2013 Microsoft Corporation. All rights reserved. | |
| Released under Apache 2.0 license as described in the file LICENSE. | |
| Author: Leonardo de Moura | |
| */ | |
| #include "runtime/hash.h" | |
| namespace lean { | |
| //----------------------------------------------------------------------------- | |
| // MurmurHash2, 64-bit versions, by Austin Appleby | |
| // https://sites.google.com/site/murmurhash/ | |
| static uint64 MurmurHash64A(void const * key, size_t len, uint64 seed) { | |
| const uint64 m = 0xc6a4a7935bd1e995; | |
| const int r = 47; | |
| uint64 h = seed ^ (len * m); | |
| const uint64 * data = (const uint64 *)key; | |
| const uint64 * end = data + (len/8); | |
| while (data != end) { | |
| uint64 k = *data++; | |
| k *= m; | |
| k ^= k >> r; | |
| k *= m; | |
| h ^= k; | |
| h *= m; | |
| } | |
| const unsigned char * data2 = (const unsigned char *) data; | |
| switch (len & 7) { | |
| case 7: h ^= uint64(data2[6]) << 48; | |
| case 6: h ^= uint64(data2[5]) << 40; | |
| case 5: h ^= uint64(data2[4]) << 32; | |
| case 4: h ^= uint64(data2[3]) << 24; | |
| case 3: h ^= uint64(data2[2]) << 16; | |
| case 2: h ^= uint64(data2[1]) << 8; | |
| case 1: h ^= uint64(data2[0]); | |
| h *= m; | |
| }; | |
| h ^= h >> r; | |
| h *= m; | |
| h ^= h >> r; | |
| return h; | |
| } | |
| uint64 hash_str(size_t len, unsigned char const * str, uint64 init_value) { | |
| return MurmurHash64A(str, len, init_value); | |
| } | |
| } |