mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-09 02:52:04 +08:00
55 lines
1.3 KiB
C
55 lines
1.3 KiB
C
/*++
|
|
/* NAME
|
|
/* hash 3
|
|
/* SUMMARY
|
|
/* compute hash value for string
|
|
/* SYNOPSIS
|
|
/* int hash(string, size)
|
|
/* char *string;
|
|
/* int size;
|
|
/* DESCRIPTION
|
|
/* This function computes for the given null-terminated string an
|
|
/* integer hash value in the range 0..size-1.
|
|
/* SEE ALSO
|
|
/* .fi
|
|
/* Alfred V. Aho, Ravi Sethi and Jeffrey D. Ullman: Compilers:
|
|
/* principles, techniques and tools; Addison-Wesley, Amsterdam, 1986.
|
|
/* AUTHOR(S)
|
|
/* Wietse Venema
|
|
/* Eindhoven University of Technology
|
|
/* Department of Mathematics and Computer Science
|
|
/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands
|
|
/*
|
|
/* Originally written by: P. J. Weinberger at Bell Labs.
|
|
/* LAST MODIFICATION
|
|
/* 92/01/15 21:53:12
|
|
/* VERSION/RELEASE
|
|
/* %I
|
|
/*--*/
|
|
|
|
static char hash_sccsid[] = "@(#) hash.c 1.1 92/01/15 21:53:12";
|
|
|
|
/* hash - hash a string; original author: P. J. Weinberger at Bell Labs. */
|
|
|
|
int hash(s, size)
|
|
register char *s;
|
|
unsigned size;
|
|
{
|
|
register unsigned long h = 0;
|
|
register unsigned long g;
|
|
|
|
/*
|
|
* For a performance comparison with the hash function presented in K&R,
|
|
* first edition, see the "Dragon" book by Aho, Sethi and Ullman.
|
|
*/
|
|
|
|
while (*s) {
|
|
h = (h << 4) + *s++;
|
|
if (g = (h & 0xf0000000)) {
|
|
h ^= (g >> 24);
|
|
h ^= g;
|
|
}
|
|
}
|
|
return (h % size);
|
|
}
|