diff options
author | Bruno Haible <bruno@clisp.org> | 2000-08-20 16:50:54 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2000-08-20 16:50:54 +0000 |
commit | c0eb5203949ad864470076ec23b6f348639fad2d (patch) | |
tree | 5a4e56bf9d9e8d0bc8216efb21e4ce620fe7f50b /lib | |
parent | cb286153b25bd6c861ad5d849475ec9726f29c82 (diff) | |
download | gperf-c0eb5203949ad864470076ec23b6f348639fad2d.tar.gz |
Allow the use of embedded NULs in keys.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hash.cc | 33 | ||||
-rw-r--r-- | lib/hash.h | 18 |
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; } @@ -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 |