diff options
author | Kenneth G Raeburn <raeburn@mit.edu> | 1991-01-28 10:06:40 +0000 |
---|---|---|
committer | Kenneth G Raeburn <raeburn@mit.edu> | 1991-01-28 10:06:40 +0000 |
commit | 79c8cdf6e9b9fa0eb2090621f5c67462040fd6e9 (patch) | |
tree | 8307700380d74e93b5b328b632eaf34bfab698e0 /server/common.c | |
parent | 06afffc73ba7b7974fc054f44a3133b748817794 (diff) |
Improved (?) hash function behavior for short strings.
Diffstat (limited to 'server/common.c')
-rw-r--r-- | server/common.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/server/common.c b/server/common.c index 1d1b7c1..dc8ed92 100644 --- a/server/common.c +++ b/server/common.c @@ -47,7 +47,7 @@ strsave (const char *sp) unsigned long hash (const char *string) { - register int hval = 0; + register unsigned long hval = 0; register char cp; while (1) { @@ -59,25 +59,25 @@ hash (const char *string) cp = *string++; if (!cp) break; - hval += cp * 9; + hval += cp * (3 + (1 << 16)); cp = *string++; if (!cp) break; - hval += cp * 17; + hval += cp * (1 + (1 << 8)); cp = *string++; if (!cp) break; - hval += cp * 65; + hval += cp * (1 + (1 << 12)); cp = *string++; if (!cp) break; - hval += cp * 129; + hval += cp * (1 + (1 << 4)); - hval += (hval & 0x7fffff) * 256; - hval &= 0x7fffffff; + hval += ((long) hval) >> 18; } + hval &= 0x7fffffff; return hval; } |