#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; }