Small optimization of generic ELF hash function

This commit is contained in:
Ulrich Drepper 2011-12-04 17:44:33 -05:00
parent 52ff5dd0e4
commit 52ad36a219
2 changed files with 23 additions and 25 deletions

View File

@ -1,6 +1,7 @@
2011-12-04 Ulrich Drepper <drepper@gmail.com>
* sysdeps/generic/dl-hash.h (_dl_elf_hash): Fix attribute.
Minor optimizations.
* sunrpc/clnt_unix.c (clntunix_control): Fix aliasing issues.
* sunrpc/clnt_tcp.c (clnttcp_control): Likewise.

View File

@ -29,42 +29,39 @@ __attribute__ ((unused))
_dl_elf_hash (const char *name_arg)
{
const unsigned char *name = (const unsigned char *) name_arg;
unsigned long int hash = 0;
if (*name != '\0')
unsigned long int hash = *name;
if (hash != 0 && name[1] != '\0')
{
hash = *name++;
if (*name != '\0')
hash = (hash << 4) + name[1];
if (name[2] != '\0')
{
hash = (hash << 4) + *name++;
if (*name != '\0')
hash = (hash << 4) + name[2];
if (name[3] != '\0')
{
hash = (hash << 4) + *name++;
if (*name != '\0')
hash = (hash << 4) + name[3];
if (name[4] != '\0')
{
hash = (hash << 4) + *name++;
if (*name != '\0')
hash = (hash << 4) + name[4];
name += 5;
while (*name != '\0')
{
unsigned long int hi;
hash = (hash << 4) + *name++;
while (*name != '\0')
{
unsigned long int hi;
hash = (hash << 4) + *name++;
hi = hash & 0xf0000000;
hi = hash & 0xf0000000;
/* The algorithm specified in the ELF ABI is as
follows:
/* The algorithm specified in the ELF ABI is as
follows:
if (hi != 0)
hash ^= hi >> 24;
if (hi != 0)
hash ^= hi >> 24;
hash &= ~hi;
hash &= ~hi;
But the following is equivalent and a lot
faster, especially on modern processors. */
But the following is equivalent and a lot
faster, especially on modern processors. */
hash ^= hi;
hash ^= hi >> 24;
}
hash ^= hi;
hash ^= hi >> 24;
}
}
}