XRootD
Loading...
Searching...
No Matches
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
35unsigned long XrdOucHashVal(const char *KeyVal)
36 {extern unsigned long XrdOucHashVal2(const char *, int);
37 return XrdOucHashVal2(KeyVal, strlen(KeyVal));
38 }
39
40unsigned 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)