Main Page | Class Hierarchy | Compound List | File List | Compound Members | File Members

hash_serv.C

Go to the documentation of this file.
00001 
00002 /*===============================<o>=====================================
00003 
00004 Copyright 1996, 1997, 2004 Ian Kaplan, Bear Products International,
00005 www.bearcave.com.
00006 
00007 All Rights Reserved
00008 
00009 You may use this software in software components for which you do
00010 not collect money (e.g., non-commercial software).  All commercial
00011 use is reserved.
00012 
00013 ===============================<o>=====================================*/
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         // Every odd word, shift the character up by one bit
00045         // It turns out that this makes a big difference in the
00046         // uniqueness of the key generated from a string
00047         if (word_cnt & 0x1) {
00048             c = c << 1;
00049         }
00050         val.c[ byte_ix ] ^= c;
00051     }
00052 
00053   return val.u;
00054 } // str_to_uint
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;  // adjust for hash table size
00091 } // hash_value
00092 

Generated on Wed Mar 31 21:15:55 2004 for Data Structures for a VHDL Compiler by doxygen 1.3.3