releasing package survex version 1.4.11-3
[survex.git] / src / hash.c
bloba6094687a311228cbef937a5b6d8ae5513488292
1 /* hash.c */
2 /* String hashing function */
3 /* Copyright (C) 1995-2002 Olly Betts
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program 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
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #include <config.h>
22 #include <ctype.h>
24 #include "debug.h"
25 #include "hash.h"
27 /* some (preferably prime) number for the hashing function */
28 #define HASH_PRIME 29363
30 #ifdef __clang__
31 __attribute__((no_sanitize("unsigned-integer-overflow")))
32 #endif
33 int
34 hash_string(const char *p)
36 int hash;
37 SVX_ASSERT(p);
38 for (hash = 0; *p; p++)
39 hash = (hash * HASH_PRIME + *(const unsigned char*)p) & 0x7fff;
40 return hash;
43 #ifdef __clang__
44 __attribute__((no_sanitize("unsigned-integer-overflow")))
45 #endif
46 int
47 hash_lc_string(const char *p)
49 int hash;
50 SVX_ASSERT(p);
51 for (hash = 0; *p; p++)
52 hash = (hash * HASH_PRIME + tolower(*(const unsigned char*)p)) & 0x7fff;
53 return hash;
56 #ifdef __clang__
57 __attribute__((no_sanitize("unsigned-integer-overflow")))
58 #endif
59 int
60 hash_data(const char *p, size_t len)
62 int hash;
63 SVX_ASSERT(p);
64 for (hash = 0; len--; p++)
65 hash = (hash * HASH_PRIME + *(const unsigned char*)p) & 0x7fff;
66 return hash;