1*7304104dSAndroid Build Coastguard Worker /* Compute hash value for given string according to ELF standard. 2*7304104dSAndroid Build Coastguard Worker Copyright (C) 1995-2015 Free Software Foundation, Inc. 3*7304104dSAndroid Build Coastguard Worker This file is part of the GNU C Library. 4*7304104dSAndroid Build Coastguard Worker 5*7304104dSAndroid Build Coastguard Worker The GNU C Library is free software; you can redistribute it and/or 6*7304104dSAndroid Build Coastguard Worker modify it under the terms of the GNU Lesser General Public 7*7304104dSAndroid Build Coastguard Worker License as published by the Free Software Foundation; either 8*7304104dSAndroid Build Coastguard Worker version 2.1 of the License, or (at your option) any later version. 9*7304104dSAndroid Build Coastguard Worker 10*7304104dSAndroid Build Coastguard Worker The GNU C Library is distributed in the hope that it will be useful, 11*7304104dSAndroid Build Coastguard Worker but WITHOUT ANY WARRANTY; without even the implied warranty of 12*7304104dSAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13*7304104dSAndroid Build Coastguard Worker Lesser General Public License for more details. 14*7304104dSAndroid Build Coastguard Worker 15*7304104dSAndroid Build Coastguard Worker You should have received a copy of the GNU Lesser General Public 16*7304104dSAndroid Build Coastguard Worker License along with the GNU C Library; if not, see 17*7304104dSAndroid Build Coastguard Worker <http://www.gnu.org/licenses/>. */ 18*7304104dSAndroid Build Coastguard Worker 19*7304104dSAndroid Build Coastguard Worker #ifndef _DL_HASH_H 20*7304104dSAndroid Build Coastguard Worker #define _DL_HASH_H 1 21*7304104dSAndroid Build Coastguard Worker 22*7304104dSAndroid Build Coastguard Worker 23*7304104dSAndroid Build Coastguard Worker /* This is the hashing function specified by the ELF ABI. In the 24*7304104dSAndroid Build Coastguard Worker first five operations no overflow is possible so we optimized it a 25*7304104dSAndroid Build Coastguard Worker bit. */ 26*7304104dSAndroid Build Coastguard Worker static unsigned int 27*7304104dSAndroid Build Coastguard Worker __attribute__ ((unused)) _dl_elf_hash(const char * name_arg)28*7304104dSAndroid Build Coastguard Worker_dl_elf_hash (const char *name_arg) 29*7304104dSAndroid Build Coastguard Worker { 30*7304104dSAndroid Build Coastguard Worker const unsigned char *name = (const unsigned char *) name_arg; 31*7304104dSAndroid Build Coastguard Worker unsigned long int hash = *name; 32*7304104dSAndroid Build Coastguard Worker if (hash != 0 && name[1] != '\0') 33*7304104dSAndroid Build Coastguard Worker { 34*7304104dSAndroid Build Coastguard Worker hash = (hash << 4) + name[1]; 35*7304104dSAndroid Build Coastguard Worker if (name[2] != '\0') 36*7304104dSAndroid Build Coastguard Worker { 37*7304104dSAndroid Build Coastguard Worker hash = (hash << 4) + name[2]; 38*7304104dSAndroid Build Coastguard Worker if (name[3] != '\0') 39*7304104dSAndroid Build Coastguard Worker { 40*7304104dSAndroid Build Coastguard Worker hash = (hash << 4) + name[3]; 41*7304104dSAndroid Build Coastguard Worker if (name[4] != '\0') 42*7304104dSAndroid Build Coastguard Worker { 43*7304104dSAndroid Build Coastguard Worker hash = (hash << 4) + name[4]; 44*7304104dSAndroid Build Coastguard Worker name += 5; 45*7304104dSAndroid Build Coastguard Worker while (*name != '\0') 46*7304104dSAndroid Build Coastguard Worker { 47*7304104dSAndroid Build Coastguard Worker unsigned long int hi; 48*7304104dSAndroid Build Coastguard Worker hash = (hash << 4) + *name++; 49*7304104dSAndroid Build Coastguard Worker hi = hash & 0xf0000000; 50*7304104dSAndroid Build Coastguard Worker 51*7304104dSAndroid Build Coastguard Worker /* The algorithm specified in the ELF ABI is as 52*7304104dSAndroid Build Coastguard Worker follows: 53*7304104dSAndroid Build Coastguard Worker 54*7304104dSAndroid Build Coastguard Worker if (hi != 0) 55*7304104dSAndroid Build Coastguard Worker hash ^= hi >> 24; 56*7304104dSAndroid Build Coastguard Worker 57*7304104dSAndroid Build Coastguard Worker hash &= ~hi; 58*7304104dSAndroid Build Coastguard Worker 59*7304104dSAndroid Build Coastguard Worker But the following is equivalent and a lot 60*7304104dSAndroid Build Coastguard Worker faster, especially on modern processors. */ 61*7304104dSAndroid Build Coastguard Worker 62*7304104dSAndroid Build Coastguard Worker hash ^= hi >> 24; 63*7304104dSAndroid Build Coastguard Worker } 64*7304104dSAndroid Build Coastguard Worker 65*7304104dSAndroid Build Coastguard Worker /* Second part of the modified formula. This 66*7304104dSAndroid Build Coastguard Worker operation can be lifted outside the loop. */ 67*7304104dSAndroid Build Coastguard Worker hash &= 0x0fffffff; 68*7304104dSAndroid Build Coastguard Worker } 69*7304104dSAndroid Build Coastguard Worker } 70*7304104dSAndroid Build Coastguard Worker } 71*7304104dSAndroid Build Coastguard Worker } 72*7304104dSAndroid Build Coastguard Worker return hash; 73*7304104dSAndroid Build Coastguard Worker } 74*7304104dSAndroid Build Coastguard Worker 75*7304104dSAndroid Build Coastguard Worker #endif /* dl-hash.h */ 76