Home | History | Annotate | Download | only in libelf
      1 /* Compute hash value for given string according to ELF standard.
      2    Copyright (C) 1995-1998, 2002, 2004 Free Software Foundation, Inc.
      3    Written by Ulrich Drepper <drepper (at) redhat.com>, 1995.
      4 
      5    This program is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation, version 2.
      8 
      9    This program is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12    GNU General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License
     15    along with this program; if not, write to the Free Software Foundation,
     16    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     17 
     18 #ifndef _DL_HASH_H
     19 #define _DL_HASH_H	1
     20 
     21 
     22 /* This is the hashing function specified by the ELF ABI.  In the
     23    first five operations no overflow is possible so we optimized it a
     24    bit.  */
     25 static inline unsigned int
     26 __attribute__ ((__pure__))
     27 _dl_elf_hash (const char *name)
     28 {
     29   const unsigned char *iname = (const unsigned char *) name;
     30   unsigned int hash = (unsigned int) *iname++;
     31   if (*iname != '\0')
     32     {
     33       hash = (hash << 4) + (unsigned int) *iname++;
     34       if (*iname != '\0')
     35 	{
     36 	  hash = (hash << 4) + (unsigned int) *iname++;
     37 	  if (*iname != '\0')
     38 	    {
     39 	      hash = (hash << 4) + (unsigned int) *iname++;
     40 	      if (*iname != '\0')
     41 		{
     42 		  hash = (hash << 4) + (unsigned int) *iname++;
     43 		  while (*iname != '\0')
     44 		    {
     45 		      unsigned int hi;
     46 		      hash = (hash << 4) + (unsigned int) *iname++;
     47 		      hi = hash & 0xf0000000;
     48 
     49 		      /* The algorithm specified in the ELF ABI is as
     50 			 follows:
     51 
     52 			 if (hi != 0)
     53 			 hash ^= hi >> 24;
     54 
     55 			 hash &= ~hi;
     56 
     57 			 But the following is equivalent and a lot
     58 			 faster, especially on modern processors.  */
     59 
     60 		      hash ^= hi;
     61 		      hash ^= hi >> 24;
     62 		    }
     63 		}
     64 	    }
     65 	}
     66     }
     67   return hash;
     68 }
     69 
     70 #endif /* dl-hash.h */
     71