summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2000-08-20 16:50:54 +0000
committerBruno Haible <bruno@clisp.org>2000-08-20 16:50:54 +0000
commitc0eb5203949ad864470076ec23b6f348639fad2d (patch)
tree5a4e56bf9d9e8d0bc8216efb21e4ce620fe7f50b /lib
parentcb286153b25bd6c861ad5d849475ec9726f29c82 (diff)
downloadgperf-c0eb5203949ad864470076ec23b6f348639fad2d.tar.gz
Allow the use of embedded NULs in keys.
Diffstat (limited to 'lib')
-rw-r--r--lib/hash.cc33
-rw-r--r--lib/hash.h18
2 files changed, 15 insertions, 36 deletions
diff --git a/lib/hash.cc b/lib/hash.cc
index 72a287f..b5bb4ad 100644
--- a/lib/hash.cc
+++ b/lib/hash.cc
@@ -1,36 +1,27 @@
/*
-Copyright (C) 1990 Free Software Foundation
+Copyright (C) 1990, 2000 Free Software Foundation
written by Doug Lea (dl@rocky.oswego.edu)
-
-This file is part of the GNU C++ Library. This library is free
-software; you can redistribute it and/or modify it under the terms of
-the GNU Library General Public License as published by the Free
-Software Foundation; either version 2 of the License, or (at your
-option) any later version. This library is distributed in the hope
-that it will be useful, but WITHOUT ANY WARRANTY; without even the
-implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE. See the GNU Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <hash.h>
/*
- some useful hash functions
+ Some useful hash function.
+ It's not a particularly good hash function (<< 5 would be better than << 4),
+ but people believe in it because it comes from Dragon book.
*/
-unsigned int hashpjw (const char* x) // From Dragon book, p436
+unsigned int
+hashpjw (const char *x, unsigned int len) // From Dragon book, p436
{
unsigned int h = 0;
unsigned int g;
- while (*x != 0)
- {
- h = (h << 4) + (unsigned char) *x++;
- if ((g = h & 0xf0000000) != 0)
- h = (h ^ (g >> 24)) ^ g;
- }
+ for (; len > 0; len--)
+ {
+ h = (h << 4) + (unsigned char) *x++;
+ if ((g = h & 0xf0000000) != 0)
+ h = (h ^ (g >> 24)) ^ g;
+ }
return h;
}
diff --git a/lib/hash.h b/lib/hash.h
index a5f324b..5dbc92b 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -1,27 +1,15 @@
// This may look like C code, but it is really -*- C++ -*-
/*
-Copyright (C) 1988, 1992 Free Software Foundation
+Copyright (C) 1988, 1992, 2000 Free Software Foundation
written by Doug Lea (dl@rocky.oswego.edu)
-
-This file is part of the GNU C++ Library. This library is free
-software; you can redistribute it and/or modify it under the terms of
-the GNU Library General Public License as published by the Free
-Software Foundation; either version 2 of the License, or (at your
-option) any later version. This library is distributed in the hope
-that it will be useful, but WITHOUT ANY WARRANTY; without even the
-implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE. See the GNU Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _hash_h
#define _hash_h 1
-/* a hash function for null-terminated char* strings using the
+/* a hash function for char[] arrays using the
method described in Aho, Sethi, & Ullman, p 436. */
-extern unsigned int hashpjw (const char*);
+extern unsigned int hashpjw (const char *string, unsigned int len);
#endif