Back to index

courier  0.68.2
hash-string.c
Go to the documentation of this file.
00001 /* Implements a string hashing function.
00002    Copyright (C) 1995, 1997, 1998, 2000, 2003 Free Software Foundation, Inc.
00003    This file is part of the GNU C Library.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018    Boston, MA 02110-1301, USA.  */
00019 
00020 #ifdef HAVE_CONFIG_H
00021 # include <config.h>
00022 #endif
00023 
00024 /* Specification.  */
00025 #include "hash-string.h"
00026 
00027 
00028 /* Defines the so called `hashpjw' function by P.J. Weinberger
00029    [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
00030    1986, 1987 Bell Telephone Laboratories, Inc.]  */
00031 unsigned long int
00032 __hash_string (const char *str_param)
00033 {
00034   unsigned long int hval, g;
00035   const char *str = str_param;
00036 
00037   /* Compute the hash value for the given string.  */
00038   hval = 0;
00039   while (*str != '\0')
00040     {
00041       hval <<= 4;
00042       hval += (unsigned char) *str++;
00043       g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
00044       if (g != 0)
00045        {
00046          hval ^= g >> (HASHWORDBITS - 8);
00047          hval ^= g;
00048        }
00049     }
00050   return hval;
00051 }