/*
 * How to use it? Well, string is the null-terminated character string
 * you need to hash. Buckets is the number of hash buckets you want to
 * use, which should be a PRIME NUMBER. This helps distribute the hash
 * values more evenly. Alphabet_size is the length of all the possible
 * characters that may be in your string. For your basic signed char type,
 * this would be 127, but you may (as I have) special purpose strings
 * which use a shorter alphabet. An example of this would be domain names,
 * which I always force to lower case, and are limited to these
 * characters: [a-z0-9.-]. The length in that case is 38. Hash_limit is
 * the maximum number of characters in the string you want to hash.
 * Generally, this should be 8 or 9. 
 */

unsigned int str_hash(unsigned char *string, unsigned int buckets, unsigned int alphabet_size, unsigned int hash_limit)
{
   int i = 0;
   unsigned int accum;

   while ((string[i] != 0) && (i < hash_limit))
      i++;

   if (i < hash_limit)
      hash_limit = i;

   accum = (unsigned int) string[hash_limit - 1];

   for (i = hash_limit - 2; i >= 0; i--)
      accum = string[i] + (accum * alphabet_size);

   return accum % buckets;
}

