Go to the documentation of this file.00001 #include "CondFormats/Common/interface/hash64.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #define mix64(a,b,c) \
00023 { \
00024 a -= b; a -= c; a ^= (c>>43); \
00025 b -= c; b -= a; b ^= (a<<9); \
00026 c -= a; c -= b; c ^= (b>>8); \
00027 a -= b; a -= c; a ^= (c>>38); \
00028 b -= c; b -= a; b ^= (a<<23); \
00029 c -= a; c -= b; c ^= (b>>5); \
00030 a -= b; a -= c; a ^= (c>>35); \
00031 b -= c; b -= a; b ^= (a<<49); \
00032 c -= a; c -= b; c ^= (b>>11); \
00033 a -= b; a -= c; a ^= (c>>12); \
00034 b -= c; b -= a; b ^= (a<<18); \
00035 c -= a; c -= b; c ^= (b>>22); \
00036 }
00037
00038 typedef unsigned long long ub8;
00039 typedef unsigned long int ub4;
00040 typedef unsigned char ub1;
00041
00042
00043 namespace cond {
00044
00045 ub8 hash64( ub1 * k, ub8 length, ub8 level)
00046
00047
00048
00049 {
00050 register ub8 a,b,c,len;
00051
00052
00053 len = length;
00054 a = b = level;
00055 c = 0x9e3779b97f4a7c13LL;
00056
00057
00058 if (((unsigned long)k)&7)
00059 {
00060 while (len >= 24)
00061 {
00062 a += (k[0] +((ub8)k[ 1]<< 8)+((ub8)k[ 2]<<16)+((ub8)k[ 3]<<24)
00063 +((ub8)k[4 ]<<32)+((ub8)k[ 5]<<40)+((ub8)k[ 6]<<48)+((ub8)k[ 7]<<56));
00064 b += (k[8] +((ub8)k[ 9]<< 8)+((ub8)k[10]<<16)+((ub8)k[11]<<24)
00065 +((ub8)k[12]<<32)+((ub8)k[13]<<40)+((ub8)k[14]<<48)+((ub8)k[15]<<56));
00066 c += (k[16] +((ub8)k[17]<< 8)+((ub8)k[18]<<16)+((ub8)k[19]<<24)
00067 +((ub8)k[20]<<32)+((ub8)k[21]<<40)+((ub8)k[22]<<48)+((ub8)k[23]<<56));
00068 mix64(a,b,c);
00069 k += 24; len -= 24;
00070 }
00071 }
00072 else
00073 {
00074 while (len >= 24)
00075 {
00076 a += *(ub8 *)(k+0);
00077 b += *(ub8 *)(k+8);
00078 c += *(ub8 *)(k+16);
00079 mix64(a,b,c);
00080 k += 24; len -= 24;
00081 }
00082 }
00083
00084
00085 c += length;
00086 switch(len)
00087 {
00088 case 23: c+=((ub8)k[22]<<56);
00089 case 22: c+=((ub8)k[21]<<48);
00090 case 21: c+=((ub8)k[20]<<40);
00091 case 20: c+=((ub8)k[19]<<32);
00092 case 19: c+=((ub8)k[18]<<24);
00093 case 18: c+=((ub8)k[17]<<16);
00094 case 17: c+=((ub8)k[16]<<8);
00095
00096 case 16: b+=((ub8)k[15]<<56);
00097 case 15: b+=((ub8)k[14]<<48);
00098 case 14: b+=((ub8)k[13]<<40);
00099 case 13: b+=((ub8)k[12]<<32);
00100 case 12: b+=((ub8)k[11]<<24);
00101 case 11: b+=((ub8)k[10]<<16);
00102 case 10: b+=((ub8)k[ 9]<<8);
00103 case 9: b+=((ub8)k[ 8]);
00104 case 8: a+=((ub8)k[ 7]<<56);
00105 case 7: a+=((ub8)k[ 6]<<48);
00106 case 6: a+=((ub8)k[ 5]<<40);
00107 case 5: a+=((ub8)k[ 4]<<32);
00108 case 4: a+=((ub8)k[ 3]<<24);
00109 case 3: a+=((ub8)k[ 2]<<16);
00110 case 2: a+=((ub8)k[ 1]<<8);
00111 case 1: a+=((ub8)k[ 0]);
00112
00113 }
00114 mix64(a,b,c);
00115
00116 return c;
00117 }
00118
00119
00120 }