[go: up one dir, main page]

File: fnv.c

package info (click to toggle)
fio 3.33-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 10,896 kB
  • sloc: ansic: 78,615; sh: 5,191; python: 4,795; makefile: 832; yacc: 204; lex: 184
file content (34 lines) | stat: -rw-r--r-- 615 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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;
}