Put a better (but slower) string hash function back in since it's only used at lex time now.
git-svn-id: http://picoc.googlecode.com/svn/trunk@64 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
70cc4eae49
commit
a9494ff382
21
table.c
21
table.c
|
@ -1,13 +1,22 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "picoc.h"
|
#include "picoc.h"
|
||||||
|
|
||||||
/* quick hash function */
|
/* hash function for strings */
|
||||||
static unsigned int TableHash(const char *Key, int KeyLen)
|
static unsigned int TableHash(const char *Key, int Len)
|
||||||
{
|
{
|
||||||
if (KeyLen == 0)
|
unsigned int Hash = Len;
|
||||||
return 0;
|
int Offset;
|
||||||
else
|
int Count;
|
||||||
return ((*Key << 24) | (Key[KeyLen-1] << 16) | (Key[KeyLen >> 1] << 8)) ^ KeyLen;
|
|
||||||
|
for (Count = 0, Offset = 8; Count < Len; Count++, Offset+=7)
|
||||||
|
{
|
||||||
|
if (Offset > sizeof(unsigned int) * 8 - 7)
|
||||||
|
Offset -= sizeof(unsigned int) * 8 - 6;
|
||||||
|
|
||||||
|
Hash ^= *Key++ << Offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialise a table */
|
/* initialise a table */
|
||||||
|
|
Loading…
Reference in a new issue