69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
# include "gen.h"
|
|
# include "../h/dbs.h"
|
|
# include "../h/aux.h"
|
|
# include "../h/symbol.h"
|
|
# include "../h/access.h"
|
|
|
|
/*
|
|
* AArhash will perform a randomizing hash on the full key.
|
|
*/
|
|
long AArhash(d, key)
|
|
register DESC *d;
|
|
char key[MAXTUP];
|
|
{
|
|
register int i;
|
|
register char *cp;
|
|
register int tmp;
|
|
register int j;
|
|
register int knt;
|
|
register int numeric;
|
|
long bucket;
|
|
|
|
bucket = 0;
|
|
knt = 0;
|
|
for (i = 1; i <= d->reldum.relatts; i++)
|
|
if (d->relxtra[i])
|
|
{
|
|
/* form pointer to field */
|
|
cp = &key[d->reloff[i]];
|
|
numeric = d->relfrmt[i] != CHAR;
|
|
for (j = 0; j < ctou(d->relfrml[i]); j++)
|
|
if (((tmp = *cp++) != ' ') || numeric)
|
|
AAaddabyte(tmp, &bucket, knt++);
|
|
}
|
|
|
|
/* remove sign bit from bucket the hard way */
|
|
bucket &= 077777;
|
|
|
|
# ifdef xATR3
|
|
AAtTfp(92, 8, "RHASH: hval=%ld", bucket);
|
|
# endif
|
|
|
|
bucket %= d->reldum.relprim;
|
|
|
|
# ifdef xATR3
|
|
AAtTfp(92, 8, " ret %ld\n", bucket);
|
|
# endif
|
|
|
|
return (bucket);
|
|
}
|
|
|
|
|
|
/*
|
|
* AAaddabyte is used to map a long key into a four byte integer.
|
|
* As bytes are added, they are first rotated, then exclusive ored
|
|
* into the existing key.
|
|
*/
|
|
AAaddabyte(ch, word, knt)
|
|
register int ch;
|
|
register long *word;
|
|
register int knt;
|
|
{
|
|
long i;
|
|
|
|
i = ctou(ch); /*get rid of any sign extension*/
|
|
knt += 8 * (knt & 3); /*alternately add 0, 8, 16 or 24 to knt */
|
|
knt &= 037;
|
|
*word ^= (i << (knt) | i >> (32 - knt));
|
|
}
|