1: # include "../ingres.h"
2: # include "../aux.h"
3: # include "../symbol.h"
4: # include "../access.h"
5: # include "../lock.h"
6:
7: /* tTf flag 92 TTF */
8:
9: long rhash(des, key)
10: struct descriptor *des;
11: char key[MAXTUP];
12: /*
13: * RHASH will perform a randomizing hash on the full key.
14: *
15: */
16: {
17: register struct descriptor *d;
18: register int i;
19: register char *cp;
20: long bucket;
21: char tmp;
22: int j, *k, knt, numeric;
23:
24: d = des;
25: bucket = 0;
26: knt = 0;
27: for (i = 1; i <= d->relatts; i++)
28: if (d->relxtra[i])
29: {
30: /* form pointer to field */
31: cp = &key[d->reloff[i]];
32: numeric = d->relfrmt[i] != CHAR;
33: for (j = 0; j < (d->relfrml[i] & I1MASK); j++)
34: if (((tmp = *cp++) != ' ') || numeric)
35: addabyte(tmp, &bucket, knt++);
36: }
37: /* remove sign bit from bucket the hard way */
38: k = (int *) &bucket;
39: *k &= 077777;
40: # ifdef xATR3
41: if (tTf(92, 8))
42: printf("rhash:hval=%s", locv(bucket));
43: # endif
44: bucket %= d->relprim;
45: # ifdef xATR3
46: if (tTf(92, 8))
47: printf(",returning %s\n", locv(bucket));
48: # endif
49: return (bucket);
50: }
51:
52: addabyte(ch, word, knt1)
53: char ch;
54: long *word;
55: int knt1;
56: /*
57: * ADDABYTE is used to map a long key into a four byte integer.
58: * As bytes are added, they are first rotated, then exclusive ored
59: * into the existing key.
60: *
61: */
62: {
63: register int knt;
64: long i;
65:
66: knt = knt1;
67: i = ch & 0377; /*get rid of any sign extension*/
68: knt += 8 * (knt & 3); /*alternately add 0, 8, 16 or 24 to knt */
69: knt &= 037;
70: *word ^= (i << (knt) | i >> (32 - knt));
71: }
Defined functions
rhash
defined in line
9; used 4 times