1189251Ssam/*
2189251SsamCopyright (C) 1990, 2000, 2002 Free Software Foundation
3189251Ssam    written by Doug Lea <dl@rocky.oswego.edu>
4189251Ssam*/
5252726Srpaulo
6252726Srpaulo#include <hash.h>
7189251Ssam
8189251Ssam/*
9189251Ssam Some useful hash function.
10189251Ssam It's not a particularly good hash function (<< 5 would be better than << 4),
11189251Ssam but people believe in it because it comes from Dragon book.
12189251Ssam*/
13189251Ssam
14189251Ssamunsigned int
15189251Ssamhashpjw (const unsigned char *x, unsigned int len) // From Dragon book, p436
16189251Ssam{
17189251Ssam  unsigned int h = 0;
18214734Srpaulo  unsigned int g;
19189251Ssam
20189251Ssam  for (; len > 0; len--)
21214734Srpaulo    {
22214734Srpaulo      h = (h << 4) + *x++;
23189251Ssam      if ((g = h & 0xf0000000) != 0)
24189251Ssam        h = (h ^ (g >> 24)) ^ g;
25189251Ssam    }
26189251Ssam  return h;
27189251Ssam}
28189251Ssam