diff options
Diffstat (limited to 'contrib/gperf/lib/hash.cc')
-rw-r--r-- | contrib/gperf/lib/hash.cc | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/contrib/gperf/lib/hash.cc b/contrib/gperf/lib/hash.cc index 72a287f..b5bb4ad 100644 --- a/contrib/gperf/lib/hash.cc +++ b/contrib/gperf/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; } |