diff options
Diffstat (limited to 'lib/lookup.c')
-rwxr-xr-x | lib/lookup.c | 96 |
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; } - |