
1: /* Copyright (c) 1997, 1998, 1999, 2004 Free Software Foundation, Inc. 2: This file is part of the GNU C Library. 3: Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997. 4: 5: The GNU C Library is free software; you can redistribute it and/or 6: modify it under the terms of the GNU Lesser General Public 7: License as published by the Free Software Foundation; either 8: version 2.1 of the License, or (at your option) any later version. 9: 10: The GNU C Library is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13: Lesser General Public License for more details. 14: 15: You should have received a copy of the GNU Lesser General Public 16: License along with the GNU C Library; if not, write to the Free 17: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18: 02111-1307 USA. */ 19: 20: #include <rpcsvc/nis.h> 21: 22: /* This is from libc/db/hash/hash_func.c, hash3 is static there */ 23: /* 24: * This is INCREDIBLY ugly, but fast. We break the string up into 8 byte 25: * units. On the first time through the loop we get the "leftover bytes" 26: * (strlen % 8). On every other iteration, we perform 8 HASHC's so we handle 27: * all 8 bytes. Essentially, this saves us 7 cmp & branch instructions. If 28: * this routine is heavily used enough, it's worth the ugly coding. 29: * 30: * OZ's original sdbm hash 31: */ 32: uint32_t 33: __nis_hash (const void *keyarg, register size_t len) 34: { 35: register const u_char *key; 36: register size_t loop; 37: register uint32_t h; 38: 39: #define HASHC h = *key++ + 65599 * h 40: 41: h = 0; 42: key = keyarg; 43: if (len > 0) 44: { 45: loop = (len + 8 - 1) >> 3; 46: switch (len & (8 - 1)) 47: { 48: case 0: 49: do { 50: HASHC; 51: /* FALLTHROUGH */ 52: case 7: 53: HASHC; 54: /* FALLTHROUGH */ 55: case 6: 56: HASHC; 57: /* FALLTHROUGH */ 58: case 5: 59: HASHC; 60: /* FALLTHROUGH */ 61: case 4: 62: HASHC; 63: /* FALLTHROUGH */ 64: case 3: 65: HASHC; 66: /* FALLTHROUGH */ 67: case 2: 68: HASHC; 69: /* FALLTHROUGH */ 70: case 1: 71: HASHC; 72: } while (--loop); 73: } 74: } 75: return h; 76: }