00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #define NDEBUG 1
00016
00017 #include "sysinc.h"
00018 #include "hash_serv.h"
00019
00020
00021 #define SIZE_INT 4
00022
00028 unsigned int hash_services::str_to_uint( const char *s )
00029 {
00030 int i, byte_ix, word_cnt;
00031 char c;
00032 union {
00033 unsigned char c[ SIZE_INT ];
00034 unsigned int u;
00035 } val;
00036
00037 val.u = 0;
00038 word_cnt = 0;
00039 for (i = 0, byte_ix = 0; i < strlen( s ); i++, byte_ix = (byte_ix + 1) % SIZE_INT) {
00040 if (i > 0 && (i % SIZE_INT) == 0) {
00041 word_cnt++;
00042 }
00043 c = s[ i ];
00044
00045
00046
00047 if (word_cnt & 0x1) {
00048 c = c << 1;
00049 }
00050 val.c[ byte_ix ] ^= c;
00051 }
00052
00053 return val.u;
00054 }
00055
00056 #undef SIZE_INT
00057
00058
00067 unsigned int hash_services::hash_value( const char *name )
00068 {
00069 unsigned int val, new_val;
00070
00071 val = str_to_uint( name );
00072
00073 new_val = val ^ (val << 1);
00074 new_val = new_val ^ (val << 2);
00075 new_val = new_val ^ (val << 3);
00076 new_val = new_val ^ (val << 4);
00077 new_val = new_val ^ (val << 5);
00078 new_val = new_val ^ (val << 6);
00079 new_val = new_val ^ (val << 7);
00080 new_val = new_val ^ (val << 8);
00081 new_val = new_val ^ (val << 9);
00082 new_val = new_val ^ (val << 10);
00083 new_val = new_val ^ (val << 11);
00084 new_val = new_val ^ (val << 12);
00085 new_val = new_val ^ (val << 13);
00086 new_val = new_val ^ (val << 14);
00087 new_val = new_val ^ (val << 15);
00088 new_val = new_val ^ (val << 16);
00089
00090 return new_val;
00091 }
00092