]>
Commit | Line | Data |
---|---|---|
ccf0426c ZC |
1 | /* jhash.h: Jenkins hash support. |
2 | * | |
3 | * Copyright (C) 2006. Bob Jenkins ([email protected]) | |
4 | * | |
5 | * http://burtleburtle.net/bob/hash/ | |
6 | * | |
7 | * These are the credits from Bob's sources: | |
8 | * | |
9 | * lookup3.c, by Bob Jenkins, May 2006, Public Domain. | |
10 | * | |
11 | * These are functions for producing 32-bit hashes for hash table lookup. | |
12 | * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final() | |
13 | * are externally useful functions. Routines to test the hash are included | |
14 | * if SELF_TEST is defined. You can use this free for any purpose. It's in | |
15 | * the public domain. It has no warranty. | |
16 | * | |
17 | * Copyright (C) 2009-2010 Jozsef Kadlecsik ([email protected]) | |
18 | * | |
19 | * I've modified Bob's hash to be useful in the Linux kernel, and | |
20 | * any bugs present are my fault. | |
21 | * Jozsef | |
22 | */ | |
23 | ||
a8b991b5 MA |
24 | #ifndef QEMU_JHASH_H |
25 | #define QEMU_JHASH_H | |
ccf0426c ZC |
26 | |
27 | #include "qemu/bitops.h" | |
28 | ||
29 | /* | |
30 | * hashtable relation copy from linux kernel jhash | |
31 | */ | |
32 | ||
33 | /* __jhash_mix -- mix 3 32-bit values reversibly. */ | |
34 | #define __jhash_mix(a, b, c) \ | |
35 | { \ | |
36 | a -= c; a ^= rol32(c, 4); c += b; \ | |
37 | b -= a; b ^= rol32(a, 6); a += c; \ | |
38 | c -= b; c ^= rol32(b, 8); b += a; \ | |
39 | a -= c; a ^= rol32(c, 16); c += b; \ | |
40 | b -= a; b ^= rol32(a, 19); a += c; \ | |
41 | c -= b; c ^= rol32(b, 4); b += a; \ | |
42 | } | |
43 | ||
44 | /* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */ | |
45 | #define __jhash_final(a, b, c) \ | |
46 | { \ | |
47 | c ^= b; c -= rol32(b, 14); \ | |
48 | a ^= c; a -= rol32(c, 11); \ | |
49 | b ^= a; b -= rol32(a, 25); \ | |
50 | c ^= b; c -= rol32(b, 16); \ | |
51 | a ^= c; a -= rol32(c, 4); \ | |
52 | b ^= a; b -= rol32(a, 14); \ | |
53 | c ^= b; c -= rol32(b, 24); \ | |
54 | } | |
55 | ||
56 | /* An arbitrary initial parameter */ | |
57 | #define JHASH_INITVAL 0xdeadbeef | |
58 | ||
a8b991b5 | 59 | #endif /* QEMU_JHASH_H */ |