MINOR: hash: add new function hash_crc32

This function will be used to perform CRC32 computations. This one wa
loosely inspired from crc32b found here, and focuses on size and speed
at the same time :

    http://www.hackersdelight.org/hdcodetxt/crc.c.txt

Much faster table-based versions exist but are pointless for our usage
here, this hash already sustains gigabit speed which is far faster than
what we'd ever need. Better preserve the CPU's cache instead.
This commit is contained in:
Willy Tarreau 2015-01-20 19:17:09 +01:00
parent 49ad95cc8e
commit c829ee48c7
2 changed files with 20 additions and 0 deletions

View File

@ -25,5 +25,6 @@
unsigned int hash_djb2(const char *key, int len);
unsigned int hash_wt6(const char *key, int len);
unsigned int hash_sdbm(const char *key, int len);
unsigned int hash_crc32(const char *key, int len);
#endif /* _COMMON_HASH_H_ */

View File

@ -85,4 +85,23 @@ unsigned int hash_sdbm(const char *key, int len)
return hash;
}
/* Small yet efficient CRC32 calculation loosely inspired from crc32b found
* here : http://www.hackersdelight.org/hdcodetxt/crc.c.txt
* The magic value represents the polynom with one bit per exponent. Much
* faster table-based versions exist but are pointless for our usage here,
* this hash already sustains gigabit speed which is far faster than what
* we'd ever need. Better preserve the CPU's cache instead.
*/
unsigned int hash_crc32(const char *key, int len)
{
unsigned int hash;
int bit;
hash = ~0;
while (len--) {
hash ^= *key++;
for (bit = 0; bit < 8; bit++)
hash = (hash >> 1) ^ ((hash & 1) ? 0xedb88320 : 0);
}
return ~hash;
}