Commit | Line | Data |
463ee0b2 |
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 | |
85e6fe83 |
10 | #include "config.h" |
463ee0b2 |
11 | #include "sdbm.h" |
12 | /* |
13 | * polynomial conversion ignoring overflows |
14 | * [this seems to work remarkably well, in fact better |
15 | * then the ndbm hash function. Replace at your own risk] |
16 | * use: 65599 nice. |
17 | * 65587 even better. |
18 | */ |
19 | long |
20 | sdbm_hash(str, len) |
21 | register char *str; |
22 | register int len; |
23 | { |
24 | register unsigned long n = 0; |
25 | |
26 | #ifdef DUFF |
27 | |
28 | #define HASHC n = *str++ + 65599 * n |
29 | |
30 | if (len > 0) { |
31 | register int loop = (len + 8 - 1) >> 3; |
32 | |
33 | switch(len & (8 - 1)) { |
34 | case 0: do { |
35 | HASHC; case 7: HASHC; |
36 | case 6: HASHC; case 5: HASHC; |
37 | case 4: HASHC; case 3: HASHC; |
38 | case 2: HASHC; case 1: HASHC; |
39 | } while (--loop); |
40 | } |
41 | |
42 | } |
43 | #else |
44 | while (len--) |
45 | n = *str++ + 65599 * n; |
46 | #endif |
47 | return n; |
48 | } |