Extra files to distribute in sysdeps/posix.
[glibc/history.git] / sysdeps / generic / dl-hash.h
blob243ae14b510f0a7b9fff00bf821d124b74c9743f
1 /* Compute hash value for given string according to ELF standard.
2 Copyright (C) 1995,1996,1997,1998,2003,2005 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
20 #ifndef _DL_HASH_H
21 #define _DL_HASH_H 1
24 /* This is the hashing function specified by the ELF ABI. In the
25 first five operations no overflow is possible so we optimized it a
26 bit. */
27 static unsigned int
28 _dl_elf_hash (const char *name_arg)
30 const unsigned char *name = (const unsigned char *) name_arg;
31 unsigned long int hash = 0;
32 if (*name != '\0')
34 hash = *name++;
35 if (*name != '\0')
37 hash = (hash << 4) + *name++;
38 if (*name != '\0')
40 hash = (hash << 4) + *name++;
41 if (*name != '\0')
43 hash = (hash << 4) + *name++;
44 if (*name != '\0')
46 hash = (hash << 4) + *name++;
47 while (*name != '\0')
49 unsigned long int hi;
50 hash = (hash << 4) + *name++;
51 hi = hash & 0xf0000000;
53 /* The algorithm specified in the ELF ABI is as
54 follows:
56 if (hi != 0)
57 hash ^= hi >> 24;
59 hash &= ~hi;
61 But the following is equivalent and a lot
62 faster, especially on modern processors. */
64 hash ^= hi;
65 hash ^= hi >> 24;
72 return hash;
75 #endif /* dl-hash.h */