summaryrefslogtreecommitdiff
path: root/server/common.c
diff options
context:
space:
mode:
authorGravatar Kenneth G Raeburn <raeburn@mit.edu>1991-01-28 10:06:40 +0000
committerGravatar Kenneth G Raeburn <raeburn@mit.edu>1991-01-28 10:06:40 +0000
commit79c8cdf6e9b9fa0eb2090621f5c67462040fd6e9 (patch)
tree8307700380d74e93b5b328b632eaf34bfab698e0 /server/common.c
parent06afffc73ba7b7974fc054f44a3133b748817794 (diff)
Improved (?) hash function behavior for short strings.
Diffstat (limited to 'server/common.c')
-rw-r--r--server/common.c14
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;
}