]> Savannah Git Hosting - gnulib.git/commitdiff
New module hashcode-string1.
authorBruno Haible <bruno@clisp.org>
Wed, 30 Apr 2025 10:47:37 +0000 (12:47 +0200)
committerBruno Haible <bruno@clisp.org>
Wed, 30 Apr 2025 11:12:24 +0000 (13:12 +0200)
* 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.

ChangeLog
lib/exclude.c
lib/hash.c
lib/hash.h
lib/hashcode-string1.c [new file with mode: 0644]
lib/hashcode-string1.h [new file with mode: 0644]
modules/exclude
modules/hash
modules/hashcode-string1 [new file with mode: 0644]

index 8d8567413bae1e2d84f16f896d972037fa0c0b6b..463cd83a9cb2f80cf85c700fb63ff6c58be7842f 100644 (file)
--- a/ChangeLog
+++ b/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.
index 485beb64f5b18f4a22e07ef3e4032d91a07963fe..cdc57d9df883341c9708344d8728b25af11ec735 100644 (file)
@@ -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
index fd761730b1a470aca0ca91d1daf8a565a974fa9f..f5518a7f43cf0701771fad2193f917d7863f54fa 100644 (file)
@@ -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
index 3cff33244f5f613d3e477e2905c60e1541139f35..626880a125c1d800a74154f158dc0535a12a0762 100644 (file)
@@ -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
diff --git a/lib/hashcode-string1.c b/lib/hashcode-string1.c
new file mode 100644 (file)
index 0000000..84d6ccf
--- /dev/null
@@ -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 */
diff --git a/lib/hashcode-string1.h b/lib/hashcode-string1.h
new file mode 100644 (file)
index 0000000..3eb7ba0
--- /dev/null
@@ -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
index 5defb0aa0c7a179d958ae1f0826e823a5d084efd..3f2491bc497db5804b96ed6004376c96d1e707b6 100644 (file)
@@ -12,6 +12,7 @@ filename
 fnmatch
 fopen-gnu
 hash
+hashcode-string1
 mbscasecmp
 mbuiter               [test "$GNULIB_MCEL_PREFER" != yes]
 nullptr
index fa1b9852a5b0fe460ec146a20d47e7395aacfa8e..60ec6b4b560a17a379f4ba58e9b9166fadf0ff92 100644 (file)
@@ -14,6 +14,7 @@ next-prime
 bool
 stdint-h
 xalloc-oversized
+hashcode-string1
 
 configure.ac:
 
diff --git a/modules/hashcode-string1 b/modules/hashcode-string1
new file mode 100644 (file)
index 0000000..49cf3f3
--- /dev/null
@@ -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