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