(linenum→info "unix/slp.c:2238")

glibc/2.7/locale/hashval.h

    1: /* Implement simple hashing table with string based keys.
    2:    Copyright (C) 1994-1997, 2000, 2001, 2002 Free Software Foundation, Inc.
    3:    This file is part of the GNU C Library.
    4:    Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, October 1994.
    5: 
    6:    The GNU C Library is free software; you can redistribute it and/or
    7:    modify it under the terms of the GNU Lesser General Public
    8:    License as published by the Free Software Foundation; either
    9:    version 2.1 of the License, or (at your option) any later version.
   10: 
   11:    The GNU C Library is distributed in the hope that it will be useful,
   12:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   13:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:    Lesser General Public License for more details.
   15: 
   16:    You should have received a copy of the GNU Lesser General Public
   17:    License along with the GNU C Library; if not, write to the Free
   18:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   19:    02111-1307 USA.  */
   20: 
   21: #ifndef hashval_t
   22: # define hashval_t unsigned long int
   23: #endif
   24: #include <limits.h>             /* For CHAR_BIT.  */
   25: 
   26: hashval_t
   27: compute_hashval (const void *key, size_t keylen)
   28: {
   29:   size_t cnt;
   30:   hashval_t hval;
   31: 
   32:   /* Compute the hash value for the given string.  The algorithm
   33:      is taken from [Aho,Sethi,Ullman], modified to reduce the number of
   34:      collisions for short strings with very varied bit patterns.
   35:      See http://www.clisp.org/haible/hashfunc.html.  */
   36:   cnt = 0;
   37:   hval = keylen;
   38:   while (cnt < keylen)
   39:     {
   40:       hval = (hval << 9) | (hval >> (sizeof hval * CHAR_BIT - 9));
   41:       hval += (hashval_t) *(((char *) key) + cnt++);
   42:     }
   43:   return hval != 0 ? hval : ~((hashval_t) 0);
   44: }
Syntax (Markdown)