parent
ada9ffaf9e
commit
c49cb30222
@ -0,0 +1,80 @@ |
||||
/*
|
||||
* Hash lookup function. |
||||
* Copyright (C) 2003, 2004 Mondru AB. |
||||
*
|
||||
* The contents of this file may be used under the terms of the GNU |
||||
* General Public License Version 2, provided that the above copyright |
||||
* notice and this permission notice is included in all copies or |
||||
* substantial portions of the software. |
||||
*
|
||||
*/ |
||||
|
||||
/**
|
||||
* lookup() |
||||
* Generates a 32 bit hash. |
||||
* Based on public domain code by Bob Jenkins |
||||
* It should be one of the best hash functions around in terms of both |
||||
* 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*/ |
||||
{ |
||||
|
||||
#define mix(a,b,c) \ |
||||
{ \
|
||||
a -= b; a -= c; a ^= (c>>13); \
|
||||
b -= c; b -= a; b ^= (a<<8); \
|
||||
c -= a; c -= b; c ^= (b>>13); \
|
||||
a -= b; a -= c; a ^= (c>>12); \
|
||||
b -= c; b -= a; b ^= (a<<16); \
|
||||
c -= a; c -= b; c ^= (b>>5); \
|
||||
a -= b; a -= c; a ^= (c>>3); \
|
||||
b -= c; b -= a; b ^= (a<<10); \
|
||||
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 */ |
||||
|
||||
/*---------------------------------------- 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; |
||||
} |
||||
|
||||
/*------------------------------------- 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); |
||||
/*-------------------------------------------- report the result */ |
||||
return c; |
||||
} |
||||
|
@ -0,0 +1,25 @@ |
||||
/*
|
||||
* Hash lookup function. |
||||
* Copyright (C) 2003, 2004 Mondru AB. |
||||
*
|
||||
* The contents of this file may be used under the terms of the GNU |
||||
* General Public License Version 2, provided that the above copyright |
||||
* notice and this permission notice is included in all copies or |
||||
* substantial portions of the software. |
||||
*
|
||||
*/ |
||||
|
||||
/**
|
||||
* lookup() |
||||
* Generates a 32 bit hash. |
||||
* Based on public domain code by Bob Jenkins |
||||
* It should be one of the best hash functions around in terms of both |
||||
* statistical properties and speed. It is NOT recommended for cryptographic |
||||
* purposes. |
||||
**/ |
||||
|
||||
#ifndef _LOOKUP_H |
||||
#define _LOOKUP_H |
||||
unsigned long int lookup( unsigned char *k, unsigned long int length, unsigned long int level); |
||||
|
||||
#endif /* !_LOOKUP_H */ |
@ -0,0 +1,80 @@ |
||||
/*
|
||||
* Hash lookup function. |
||||
* Copyright (C) 2003, 2004 Mondru AB. |
||||
*
|
||||
* The contents of this file may be used under the terms of the GNU |
||||
* General Public License Version 2, provided that the above copyright |
||||
* notice and this permission notice is included in all copies or |
||||
* substantial portions of the software. |
||||
*
|
||||
*/ |
||||
|
||||
/**
|
||||
* lookup() |
||||
* Generates a 32 bit hash. |
||||
* Based on public domain code by Bob Jenkins |
||||
* It should be one of the best hash functions around in terms of both |
||||
* 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*/ |
||||
{ |
||||
|
||||
#define mix(a,b,c) \ |
||||
{ \
|
||||
a -= b; a -= c; a ^= (c>>13); \
|
||||
b -= c; b -= a; b ^= (a<<8); \
|
||||
c -= a; c -= b; c ^= (b>>13); \
|
||||
a -= b; a -= c; a ^= (c>>12); \
|
||||
b -= c; b -= a; b ^= (a<<16); \
|
||||
c -= a; c -= b; c ^= (b>>5); \
|
||||
a -= b; a -= c; a ^= (c>>3); \
|
||||
b -= c; b -= a; b ^= (a<<10); \
|
||||
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 */ |
||||
|
||||
/*---------------------------------------- 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; |
||||
} |
||||
|
||||
/*------------------------------------- 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); |
||||
/*-------------------------------------------- report the result */ |
||||
return c; |
||||
} |
||||
|
@ -0,0 +1,25 @@ |
||||
/*
|
||||
* Hash lookup function. |
||||
* Copyright (C) 2003, 2004 Mondru AB. |
||||
*
|
||||
* The contents of this file may be used under the terms of the GNU |
||||
* General Public License Version 2, provided that the above copyright |
||||
* notice and this permission notice is included in all copies or |
||||
* substantial portions of the software. |
||||
*
|
||||
*/ |
||||
|
||||
/**
|
||||
* lookup() |
||||
* Generates a 32 bit hash. |
||||
* Based on public domain code by Bob Jenkins |
||||
* It should be one of the best hash functions around in terms of both |
||||
* statistical properties and speed. It is NOT recommended for cryptographic |
||||
* purposes. |
||||
**/ |
||||
|
||||
#ifndef _LOOKUP_H |
||||
#define _LOOKUP_H |
||||
unsigned long int lookup( unsigned char *k, unsigned long int length, unsigned long int level); |
||||
|
||||
#endif /* !_LOOKUP_H */ |
Reference in new issue