XRootD
XrdOucHashVal.cc
Go to the documentation of this file.
1 /******************************************************************************/
2 /* */
3 /* X r d O u c H a s h V a l . c c */
4 /* */
5 /* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
6 /* Produced by Andrew Hanushevsky for Stanford University under contract */
7 /* DE-AC02-76-SFO0515 with the Department of Energy */
8 /* */
9 /* This file is part of the XRootD software suite. */
10 /* */
11 /* XRootD is free software: you can redistribute it and/or modify it under */
12 /* the terms of the GNU Lesser General Public License as published by the */
13 /* Free Software Foundation, either version 3 of the License, or (at your */
14 /* option) any later version. */
15 /* */
16 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */
17 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
18 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
19 /* License for more details. */
20 /* */
21 /* You should have received a copy of the GNU Lesser General Public License */
22 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
23 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
24 /* */
25 /* The copyright holder's institutional names and contributor's names may not */
26 /* be used to endorse or promote products derived from this software without */
27 /* specific prior written permission of the institution or contributor. */
28 /******************************************************************************/
29 
30 #include "string.h"
31 #ifndef WIN32
32 #include "strings.h"
33 #endif
34 
35 unsigned long XrdOucHashVal(const char *KeyVal)
36  {extern unsigned long XrdOucHashVal2(const char *, int);
37  return XrdOucHashVal2(KeyVal, strlen(KeyVal));
38  }
39 
40 unsigned long XrdOucHashVal2(const char *KeyVal, int KeyLen)
41 { int j;
42  unsigned long *lp, lword, hval = 0;
43  int hl = sizeof(hval);
44 
45 // If name is shorter than the hash length, use the name.
46 //
47  if (KeyLen <= hl)
48  {memcpy(&hval, KeyVal, (size_t)KeyLen);
49  return hval;
50  }
51 
52 // Compute the length of the name and develop starting hash.
53 //
54  hval = KeyLen;
55  j = KeyLen % hl; KeyLen /= hl;
56  if (j)
57  {memcpy(&lword, KeyVal, (size_t)hl);
58  hval ^= lword;
59  }
60  lp = (unsigned long *)&KeyVal[j];
61 
62 // Compute and return the full hash.
63 //
64  while(KeyLen--)
65  {memcpy(&lword, lp++, (size_t)hl);
66  hval ^= lword;
67  }
68  return (hval ? hval : 1);
69 }
unsigned long XrdOucHashVal2(const char *KeyVal, int KeyLen)
unsigned long XrdOucHashVal(const char *KeyVal)