| OLD | NEW |
| (Empty) |
| 1 // From http://www.azillionmonkeys.com/qed/hash.html | |
| 2 | |
| 3 #include "net/disk_cache/hash.h" | |
| 4 | |
| 5 typedef uint32 uint32_t; | |
| 6 typedef uint16 uint16_t; | |
| 7 | |
| 8 namespace disk_cache { | |
| 9 | |
| 10 #undef get16bits | |
| 11 #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ | |
| 12 || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) | |
| 13 #define get16bits(d) (*((const uint16_t *) (d))) | |
| 14 #endif | |
| 15 | |
| 16 #if !defined (get16bits) | |
| 17 #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ | |
| 18 +(uint32_t)(((const uint8_t *)(d))[0]) ) | |
| 19 #endif | |
| 20 | |
| 21 uint32 SuperFastHash(const char * data, int len) { | |
| 22 uint32_t hash = len, tmp; | |
| 23 int rem; | |
| 24 | |
| 25 if (len <= 0 || data == NULL) | |
| 26 return 0; | |
| 27 | |
| 28 rem = len & 3; | |
| 29 len >>= 2; | |
| 30 | |
| 31 /* Main loop */ | |
| 32 for (; len > 0; len--) { | |
| 33 hash += get16bits(data); | |
| 34 tmp = (get16bits(data + 2) << 11) ^ hash; | |
| 35 hash = (hash << 16) ^ tmp; | |
| 36 data += 2 * sizeof(uint16_t); | |
| 37 hash += hash >> 11; | |
| 38 } | |
| 39 | |
| 40 /* Handle end cases */ | |
| 41 switch (rem) { | |
| 42 case 3: | |
| 43 hash += get16bits(data); | |
| 44 hash ^= hash << 16; | |
| 45 | |
| 46 // Treat the final character as signed. This ensures all platforms behave | |
| 47 // consistently with the original x86 code. | |
| 48 hash ^= static_cast<signed char>(data[sizeof(uint16_t)]) << 18; | |
| 49 hash += hash >> 11; | |
| 50 break; | |
| 51 case 2: | |
| 52 hash += get16bits(data); | |
| 53 hash ^= hash << 11; | |
| 54 hash += hash >> 17; | |
| 55 break; | |
| 56 case 1: | |
| 57 hash += static_cast<signed char>(*data); | |
| 58 hash ^= hash << 10; | |
| 59 hash += hash >> 1; | |
| 60 } | |
| 61 | |
| 62 /* Force "avalanching" of final 127 bits */ | |
| 63 hash ^= hash << 3; | |
| 64 hash += hash >> 5; | |
| 65 hash ^= hash << 4; | |
| 66 hash += hash >> 17; | |
| 67 hash ^= hash << 25; | |
| 68 hash += hash >> 6; | |
| 69 | |
| 70 return hash; | |
| 71 } | |
| 72 | |
| 73 } // namespace disk_cache | |
| OLD | NEW |