00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _XENO_NUCLEUS_JHASH_H
00025 #define _XENO_NUCLEUS_JHASH_H
00026
00027 #include <nucleus/types.h>
00028
00029
00030 #define __jhash_mix(a, b, c) \
00031 { \
00032 a -= b; a -= c; a ^= (c>>13); \
00033 b -= c; b -= a; b ^= (a<<8); \
00034 c -= a; c -= b; c ^= (b>>13); \
00035 a -= b; a -= c; a ^= (c>>12); \
00036 b -= c; b -= a; b ^= (a<<16); \
00037 c -= a; c -= b; c ^= (b>>5); \
00038 a -= b; a -= c; a ^= (c>>3); \
00039 b -= c; b -= a; b ^= (a<<10); \
00040 c -= a; c -= b; c ^= (b>>15); \
00041 }
00042
00043
00044 #define JHASH_GOLDEN_RATIO 0x9e3779b9
00045
00046
00047
00048
00049 static inline uint32_t jhash2(const uint32_t *k, uint32_t length, uint32_t initval)
00050 {
00051 uint32_t a, b, c, len;
00052
00053 a = b = JHASH_GOLDEN_RATIO;
00054 c = initval;
00055 len = length;
00056
00057 while (len >= 3) {
00058 a += k[0];
00059 b += k[1];
00060 c += k[2];
00061 __jhash_mix(a, b, c);
00062 k += 3; len -= 3;
00063 }
00064
00065 c += length * 4;
00066
00067 switch (len) {
00068 case 2 : b += k[1];
00069 case 1 : a += k[0];
00070 };
00071
00072 __jhash_mix(a,b,c);
00073
00074 return c;
00075 }
00076
00077 #endif