aboutsummaryrefslogtreecommitdiffstats
path: root/lib/lookup.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lookup.c')
-rwxr-xr-xlib/lookup.c96
1 files changed, 54 insertions, 42 deletions
diff --git a/lib/lookup.c b/lib/lookup.c
index 02e2491..d2f13c4 100755
--- a/lib/lookup.c
+++ b/lib/lookup.c
@@ -17,10 +17,10 @@
* statistical properties and speed. It is NOT recommended for cryptographic
* purposes.
**/
-unsigned long int lookup( k, length, level)
-register unsigned char *k; /* the key */
-register unsigned long int length; /* the length of the key */
-register unsigned long int level; /* the previous hash, or an arbitrary value*/
+unsigned long int lookup(k, length, level)
+register unsigned char *k; /* the key */
+register unsigned long int length; /* the length of the key */
+register unsigned long int level; /* the previous hash, or an arbitrary value */
{
#define mix(a,b,c) \
@@ -36,45 +36,57 @@ register unsigned long int level; /* the previous hash, or an arbitrary value*/
c -= a; c -= b; c ^= (b>>15); \
}
- typedef unsigned long int ub4; /* unsigned 4-byte quantities */
- typedef unsigned char ub1; /* unsigned 1-byte quantities */
- register unsigned long int a,b,c,len;
-
- /* Set up the internal state */
- len = length;
- a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
- c = level; /* the previous hash value */
-
+ typedef unsigned long int ub4; /* unsigned 4-byte quantities */
+ typedef unsigned char ub1; /* unsigned 1-byte quantities */
+ register unsigned long int a, b, c, len;
+
+ /* Set up the internal state */
+ len = length;
+ a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
+ c = level; /* the previous hash value */
+
/*---------------------------------------- handle most of the key */
- while (len >= 12)
- {
- a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24));
- b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24));
- c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24));
- mix(a,b,c);
- k += 12; len -= 12;
- }
-
+ while (len >= 12) {
+ a += (k[0] + ((ub4) k[1] << 8) + ((ub4) k[2] << 16) +
+ ((ub4) k[3] << 24));
+ b += (k[4] + ((ub4) k[5] << 8) + ((ub4) k[6] << 16) +
+ ((ub4) k[7] << 24));
+ c += (k[8] + ((ub4) k[9] << 8) + ((ub4) k[10] << 16) +
+ ((ub4) k[11] << 24));
+ mix(a, b, c);
+ k += 12;
+ len -= 12;
+ }
+
/*------------------------------------- handle the last 11 bytes */
- c += length;
- switch(len) /* all the case statements fall through */
- {
- case 11: c+=((ub4)k[10]<<24);
- case 10: c+=((ub4)k[9]<<16);
- case 9 : c+=((ub4)k[8]<<8);
- /* the first byte of c is reserved for the length */
- case 8 : b+=((ub4)k[7]<<24);
- case 7 : b+=((ub4)k[6]<<16);
- case 6 : b+=((ub4)k[5]<<8);
- case 5 : b+=k[4];
- case 4 : a+=((ub4)k[3]<<24);
- case 3 : a+=((ub4)k[2]<<16);
- case 2 : a+=((ub4)k[1]<<8);
- case 1 : a+=k[0];
- /* case 0: nothing left to add */
- }
- mix(a,b,c);
+ c += length;
+ switch (len) { /* all the case statements fall through */
+ case 11:
+ c += ((ub4) k[10] << 24);
+ case 10:
+ c += ((ub4) k[9] << 16);
+ case 9:
+ c += ((ub4) k[8] << 8);
+ /* the first byte of c is reserved for the length */
+ case 8:
+ b += ((ub4) k[7] << 24);
+ case 7:
+ b += ((ub4) k[6] << 16);
+ case 6:
+ b += ((ub4) k[5] << 8);
+ case 5:
+ b += k[4];
+ case 4:
+ a += ((ub4) k[3] << 24);
+ case 3:
+ a += ((ub4) k[2] << 16);
+ case 2:
+ a += ((ub4) k[1] << 8);
+ case 1:
+ a += k[0];
+ /* case 0: nothing left to add */
+ }
+ mix(a, b, c);
/*-------------------------------------------- report the result */
- return c;
+ return c;
}
-