1/*
2 * sdbm - ndbm work-alike hashed database library
3 * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
4 * author: oz@nexus.yorku.ca
5 * status: public domain. keep it that way.
6 *
7 * hashing routine
8 */
9
10#include "sdbm.h"
11/*
12 * polynomial conversion ignoring overflows
13 * [this seems to work remarkably well, in fact better
14 * then the ndbm hash function. Replace at your own risk]
15 * use: 65599	nice.
16 *      65587   even better.
17 */
18long
19sdbm_hash(str, len)
20register char *str;
21#ifdef VISUAL_CC
22register int len;
23#else
24register size_t len;
25#endif
26{
27	register unsigned long n = 0;
28
29#ifdef HAVE_DUFF
30
31#define HASHC	n = *str++ + 65599 * n
32
33	if (len > 0) {
34		register int loop = (len + 8 - 1) >> 3;
35
36		switch(len & (8 - 1)) {
37		case 0:	do {
38			HASHC;	case 7:	HASHC;
39		case 6:	HASHC;	case 5:	HASHC;
40		case 4:	HASHC;	case 3:	HASHC;
41		case 2:	HASHC;	case 1:	HASHC;
42			} while (--loop);
43		}
44
45	}
46#else
47	while (len--)
48		n = *str++ + 65599 * n;
49#endif
50	return n;
51}
52