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>
|
2025-04-30 Bruno Haible <bruno@clisp.org>
|
||||||
|
|
||||||
Rename module hashcode-string to hashcode-string2.
|
Rename module hashcode-string to hashcode-string2.
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#include "filename.h"
|
#include "filename.h"
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
|
#include "hashcode-string1.h"
|
||||||
#if GNULIB_MCEL_PREFER
|
#if GNULIB_MCEL_PREFER
|
||||||
# include "mcel.h"
|
# include "mcel.h"
|
||||||
#else
|
#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;
|
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. */
|
/* If the user passes a NULL hasher, we hash the raw pointer. */
|
||||||
static size_t
|
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
|
/* 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.
|
reasonable values, and return true if there is no gross error with it.
|
||||||
Otherwise, definitively reset the TUNING field to some acceptable default
|
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,
|
extern size_t hash_do_for_each (const Hash_table *table,
|
||||||
Hash_processor processor, void *processor_data);
|
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.
|
/* 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
|
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
|
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. */
|
table, don't modify the table and return NULL. */
|
||||||
extern void *hash_remove (Hash_table *table, const void *entry);
|
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
|
# ifdef __cplusplus
|
||||||
}
|
}
|
||||||
# endif
|
# 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
|
fnmatch
|
||||||
fopen-gnu
|
fopen-gnu
|
||||||
hash
|
hash
|
||||||
|
hashcode-string1
|
||||||
mbscasecmp
|
mbscasecmp
|
||||||
mbuiter [test "$GNULIB_MCEL_PREFER" != yes]
|
mbuiter [test "$GNULIB_MCEL_PREFER" != yes]
|
||||||
nullptr
|
nullptr
|
||||||
|
@@ -14,6 +14,7 @@ next-prime
|
|||||||
bool
|
bool
|
||||||
stdint-h
|
stdint-h
|
||||||
xalloc-oversized
|
xalloc-oversized
|
||||||
|
hashcode-string1
|
||||||
|
|
||||||
configure.ac:
|
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