blob: 78c0a5be7bf971a8e94f851d29cac49b8776b88b [file] [log] [blame]
willy tarreau12350152005-12-18 01:03:27 +01001/*
2 This File is copied from
3
4 http://www.oreilly.com/catalog/masteralgoc/index.html
5 Mastering Algorithms with C
6 By Kyle Loudon
7 ISBN: 1-56592-453-3
8 Publishd by O'Reilly
9
10 We have added our own struct to these function.
11 */
12
13/*****************************************************************************
14* *
15* ------------------------------- hashpjw.c ------------------------------ *
16* *
17*****************************************************************************/
18
Willy Tarreaubaaee002006-06-26 02:48:02 +020019#include <haproxy/hashpjw.h>
20#include <haproxy/appsession.h>
willy tarreau12350152005-12-18 01:03:27 +010021
22/*****************************************************************************
23* *
24* -------------------------------- hashpjw ------------------------------- *
25* *
26*****************************************************************************/
27
28int hashpjw(const void *key) {
29
Willy Tarreaubaaee002006-06-26 02:48:02 +020030 const char *ptr;
31 unsigned int val;
32 appsess *appsession_temp;
willy tarreau12350152005-12-18 01:03:27 +010033
Willy Tarreaubaaee002006-06-26 02:48:02 +020034 /*********************************************************************
35 * *
36 * Hash the key by performing a number of bit operations on it. *
37 * *
38 *********************************************************************/
willy tarreau12350152005-12-18 01:03:27 +010039
Willy Tarreaubaaee002006-06-26 02:48:02 +020040 val = 0;
41 appsession_temp = (appsess *)key;
42 ptr = appsession_temp->sessid;
willy tarreau12350152005-12-18 01:03:27 +010043
Willy Tarreaubaaee002006-06-26 02:48:02 +020044 while (*ptr != '\0') {
willy tarreau12350152005-12-18 01:03:27 +010045
Willy Tarreaubaaee002006-06-26 02:48:02 +020046 int tmp;
willy tarreau12350152005-12-18 01:03:27 +010047
Willy Tarreaubaaee002006-06-26 02:48:02 +020048 val = (val << 4) + (*ptr);
willy tarreau12350152005-12-18 01:03:27 +010049
Willy Tarreaubaaee002006-06-26 02:48:02 +020050 if((tmp = (val & 0xf0000000))) {
51 val = val ^ (tmp >> 24);
52 val = val ^ tmp;
53 }
54 ptr++;
55 }/* end while */
willy tarreau12350152005-12-18 01:03:27 +010056
Willy Tarreaubaaee002006-06-26 02:48:02 +020057 /*********************************************************************
58 * *
59 * In practice, replace PRIME_TBLSIZ with the actual table size. *
60 * *
61 *********************************************************************/
62 return val % PRIME_TBLSIZ;
willy tarreau12350152005-12-18 01:03:27 +010063}/* end hashpjw */
Willy Tarreaubaaee002006-06-26 02:48:02 +020064
65/*
66 * Local variables:
67 * c-indent-level: 8
68 * c-basic-offset: 8
69 * End:
70 */