mirror of
https://git.savannah.gnu.org/git/gnulib.git
synced 2025-08-08 17:22:05 +03:00
New module hashcode-string1.
* lib/hashcode-string1.h: New file. * lib/hashcode-string1.c: New file, based on lib/hash.c. * modules/hashcode-string1: New file. * lib/hash.h: Include hashcode-string1.h. (hash_string): Remove declaration. * lib/hash.c (hash_string): Remove function. * modules/hash (Depends-on): Add hashcode-string1. * lib/exclude.c: Include hashcode-string1.h. * modules/exclude (Depends-on): Add hashcode-string1.
This commit is contained in:
13
ChangeLog
13
ChangeLog
@@ -1,3 +1,16 @@
|
||||
2025-04-30 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
New module hashcode-string1.
|
||||
* lib/hashcode-string1.h: New file.
|
||||
* lib/hashcode-string1.c: New file, based on lib/hash.c.
|
||||
* modules/hashcode-string1: New file.
|
||||
* lib/hash.h: Include hashcode-string1.h.
|
||||
(hash_string): Remove declaration.
|
||||
* lib/hash.c (hash_string): Remove function.
|
||||
* modules/hash (Depends-on): Add hashcode-string1.
|
||||
* lib/exclude.c: Include hashcode-string1.h.
|
||||
* modules/exclude (Depends-on): Add hashcode-string1.
|
||||
|
||||
2025-04-30 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
Rename module hashcode-string to hashcode-string2.
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#include "filename.h"
|
||||
#include <fnmatch.h>
|
||||
#include "hash.h"
|
||||
#include "hashcode-string1.h"
|
||||
#if GNULIB_MCEL_PREFER
|
||||
# include "mcel.h"
|
||||
#else
|
||||
|
59
lib/hash.c
59
lib/hash.c
@@ -345,57 +345,6 @@ hash_do_for_each (const Hash_table *table, Hash_processor processor,
|
||||
return counter;
|
||||
}
|
||||
|
||||
/* Allocation and clean-up. */
|
||||
|
||||
#if USE_DIFF_HASH
|
||||
|
||||
/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
|
||||
B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
|
||||
Software--practice & experience 20, 2 (Feb 1990), 209-224. Good hash
|
||||
algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
|
||||
may not be good for your application." */
|
||||
|
||||
size_t
|
||||
hash_string (const char *string, size_t n_buckets)
|
||||
{
|
||||
# define HASH_ONE_CHAR(Value, Byte) \
|
||||
((Byte) + rotl_sz (Value, 7))
|
||||
|
||||
size_t value = 0;
|
||||
unsigned char ch;
|
||||
|
||||
for (; (ch = *string); string++)
|
||||
value = HASH_ONE_CHAR (value, ch);
|
||||
return value % n_buckets;
|
||||
|
||||
# undef HASH_ONE_CHAR
|
||||
}
|
||||
|
||||
#else /* not USE_DIFF_HASH */
|
||||
|
||||
/* This one comes from 'recode', and performs a bit better than the above as
|
||||
per a few experiments. It is inspired from a hashing routine found in the
|
||||
very old Cyber 'snoop', itself written in typical Greg Mansfield style.
|
||||
(By the way, what happened to this excellent man? Is he still alive?) */
|
||||
|
||||
size_t
|
||||
hash_string (const char *string, size_t n_buckets)
|
||||
{
|
||||
size_t value = 0;
|
||||
unsigned char ch;
|
||||
|
||||
for (; (ch = *string); string++)
|
||||
value = (value * 31 + ch) % n_buckets;
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif /* not USE_DIFF_HASH */
|
||||
|
||||
void
|
||||
hash_reset_tuning (Hash_tuning *tuning)
|
||||
{
|
||||
*tuning = default_tuning;
|
||||
}
|
||||
|
||||
/* If the user passes a NULL hasher, we hash the raw pointer. */
|
||||
static size_t
|
||||
@@ -418,6 +367,14 @@ raw_comparator (const void *a, const void *b)
|
||||
}
|
||||
|
||||
|
||||
/* Allocation and clean-up. */
|
||||
|
||||
void
|
||||
hash_reset_tuning (Hash_tuning *tuning)
|
||||
{
|
||||
*tuning = default_tuning;
|
||||
}
|
||||
|
||||
/* For the given hash TABLE, check the user supplied tuning structure for
|
||||
reasonable values, and return true if there is no gross error with it.
|
||||
Otherwise, definitively reset the TUNING field to some acceptable default
|
||||
|
11
lib/hash.h
11
lib/hash.h
@@ -130,11 +130,6 @@ typedef bool (*Hash_processor) (void *entry, void *processor_data);
|
||||
extern size_t hash_do_for_each (const Hash_table *table,
|
||||
Hash_processor processor, void *processor_data);
|
||||
|
||||
/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
|
||||
This is a convenience routine for constructing other hashing functions. */
|
||||
extern size_t hash_string (const char *string, size_t n_buckets)
|
||||
_GL_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return a hash code of ENTRY, in the range 0..TABLE_SIZE-1.
|
||||
This hash code function must have the property that if the comparator of
|
||||
ENTRY1 and ENTRY2 returns true, the hasher returns the same value for ENTRY1
|
||||
@@ -276,6 +271,12 @@ extern int hash_insert_if_absent (Hash_table *table, const void *entry,
|
||||
table, don't modify the table and return NULL. */
|
||||
extern void *hash_remove (Hash_table *table, const void *entry);
|
||||
|
||||
|
||||
# if GNULIB_HASHCODE_STRING1
|
||||
/* Include declarations of module 'hashcode-string1'. */
|
||||
# include "hashcode-string1.h"
|
||||
# endif
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
62
lib/hashcode-string1.c
Normal file
62
lib/hashcode-string1.c
Normal file
@@ -0,0 +1,62 @@
|
||||
/* hashcode-string1.c -- compute a hash value from a NUL-terminated string.
|
||||
|
||||
Copyright (C) 1998-2004, 2006-2007, 2009-2025 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "hashcode-string1.h"
|
||||
|
||||
#if USE_DIFF_HASH
|
||||
|
||||
# include "bitrotate.h"
|
||||
|
||||
/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
|
||||
B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
|
||||
Software--practice & experience 20, 2 (Feb 1990), 209-224. Good hash
|
||||
algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
|
||||
may not be good for your application." */
|
||||
|
||||
size_t
|
||||
hash_string (const char *string, size_t tablesize)
|
||||
{
|
||||
size_t value = 0;
|
||||
unsigned char ch;
|
||||
|
||||
for (; (ch = *string); string++)
|
||||
value = ch + rotl_sz (value, 7);
|
||||
return value % tablesize;
|
||||
}
|
||||
|
||||
#else /* not USE_DIFF_HASH */
|
||||
|
||||
/* This one comes from 'recode', and performs a bit better than the above as
|
||||
per a few experiments. It is inspired from a hashing routine found in the
|
||||
very old Cyber 'snoop', itself written in typical Greg Mansfield style.
|
||||
(By the way, what happened to this excellent man? Is he still alive?) */
|
||||
|
||||
size_t
|
||||
hash_string (const char *string, size_t tablesize)
|
||||
{
|
||||
size_t value = 0;
|
||||
unsigned char ch;
|
||||
|
||||
for (; (ch = *string); string++)
|
||||
value = (value * 31 + ch) % tablesize;
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif /* not USE_DIFF_HASH */
|
38
lib/hashcode-string1.h
Normal file
38
lib/hashcode-string1.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/* hashcode-string1.h -- declaration for a simple hash function
|
||||
Copyright (C) 1998-2004, 2006-2007, 2009-2025 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* This file uses _GL_ATTRIBUTE_PURE. */
|
||||
#if !_GL_CONFIG_H_INCLUDED
|
||||
#error "Please include config.h first."
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Compute a hash code for a NUL-terminated string S,
|
||||
and return the hash code modulo TABLESIZE.
|
||||
The result is platform dependent: it depends on the size of the 'size_t'
|
||||
type. */
|
||||
extern size_t hash_string (char const *s, size_t tablesize) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@@ -12,6 +12,7 @@ filename
|
||||
fnmatch
|
||||
fopen-gnu
|
||||
hash
|
||||
hashcode-string1
|
||||
mbscasecmp
|
||||
mbuiter [test "$GNULIB_MCEL_PREFER" != yes]
|
||||
nullptr
|
||||
|
@@ -14,6 +14,7 @@ next-prime
|
||||
bool
|
||||
stdint-h
|
||||
xalloc-oversized
|
||||
hashcode-string1
|
||||
|
||||
configure.ac:
|
||||
|
||||
|
24
modules/hashcode-string1
Normal file
24
modules/hashcode-string1
Normal file
@@ -0,0 +1,24 @@
|
||||
Description:
|
||||
Compute a hash value for a NUL-terminated string.
|
||||
|
||||
Files:
|
||||
lib/hashcode-string1.h
|
||||
lib/hashcode-string1.c
|
||||
|
||||
Depends-on:
|
||||
bitrotate
|
||||
|
||||
configure.ac:
|
||||
gl_MODULE_INDICATOR([hashcode-string1])
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += hashcode-string1.h hashcode-string1.c
|
||||
|
||||
Include:
|
||||
"hashcode-string1.h"
|
||||
|
||||
License:
|
||||
LGPLv2+
|
||||
|
||||
Maintainer:
|
||||
Jim Meyering
|
Reference in New Issue
Block a user