| #include "fnv.h" |
| |
| #define FNV_PRIME 0x100000001b3ULL |
| |
| /* |
| * 64-bit fnv, but don't require 64-bit multiples of data. Use bytes |
| * for the last unaligned chunk. |
| */ |
| uint64_t fnv(const void *buf, uint32_t len, uint64_t hval) |
| { |
| const uint64_t *ptr = buf; |
| |
| while (len) { |
| hval *= FNV_PRIME; |
| if (len >= sizeof(uint64_t)) { |
| hval ^= (uint64_t) *ptr++; |
| len -= sizeof(uint64_t); |
| continue; |
| } else { |
| const uint8_t *ptr8 = (const uint8_t *) ptr; |
| uint64_t val = 0; |
| int i; |
| |
| for (i = 0; i < len; i++) { |
| val <<= 8; |
| val |= (uint8_t) *ptr8++; |
| } |
| hval ^= val; |
| break; |
| } |
| } |
| |
| return hval; |
| } |