Convert uses of hash_string_pointer to fasthash equivalent
authorJohn Naylor <john.naylor@postgresql.org>
Sat, 6 Apr 2024 05:17:07 +0000 (12:17 +0700)
committerJohn Naylor <john.naylor@postgresql.org>
Sat, 6 Apr 2024 05:20:40 +0000 (12:20 +0700)
Remove duplicate hash_string_pointer() function definitions by creating
a new inline function hash_string() for this purpose.

This has the added advantage of avoiding strlen() calls when doing hash
lookup. It's not clear how many of these are perfomance-sensitive
enough to benefit from that, but the simplification is worth it on
its own.

Reviewed by Jeff Davis

Discussion: https://postgr.es/m/CANWCAZbg_XeSeY0a_PqWmWqeRATvzTzUNYRLeT%2Bbzs%2BYQdC92g%40mail.gmail.com

src/bin/pg_combinebackup/load_manifest.c
src/bin/pg_dump/pg_dumpall.c
src/bin/pg_rewind/filemap.c
src/bin/pg_verifybackup/pg_verifybackup.c
src/include/common/hashfn_unstable.h

index 58677e5e3e73a84758a662911f8bbed055a47607..9c9332cdd5cfeb1856957183808215734c5b4772 100644 (file)
@@ -15,7 +15,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include "common/hashfn.h"
+#include "common/hashfn_unstable.h"
 #include "common/logging.h"
 #include "common/parse_manifest.h"
 #include "load_manifest.h"
  * Define a hash table which we can use to store information about the files
  * mentioned in the backup manifest.
  */
-static uint32 hash_string_pointer(char *s);
 #define SH_PREFIX      manifest_files
 #define SH_ELEMENT_TYPE    manifest_file
 #define SH_KEY_TYPE        char *
 #define    SH_KEY          pathname
-#define SH_HASH_KEY(tb, key)   hash_string_pointer(key)
+#define SH_HASH_KEY(tb, key)   hash_string(key)
 #define SH_EQUAL(tb, a, b)     (strcmp(a, b) == 0)
 #define    SH_SCOPE        extern
 #define SH_RAW_ALLOCATOR   pg_malloc0
@@ -311,14 +310,3 @@ combinebackup_per_wal_range_cb(JsonManifestParseContext *context,
        manifest->last_wal_range->next = range;
    manifest->last_wal_range = range;
 }
-
-/*
- * Helper function for manifest_files hash table.
- */
-static uint32
-hash_string_pointer(char *s)
-{
-   unsigned char *ss = (unsigned char *) s;
-
-   return hash_bytes(ss, strlen(s));
-}
index 046c0dc3b36708e293ae7b2a10c2203fef85cb8a..73337f339233899a6480b0015b513f780f099247 100644 (file)
@@ -21,7 +21,7 @@
 #include "catalog/pg_authid_d.h"
 #include "common/connect.h"
 #include "common/file_utils.h"
-#include "common/hashfn.h"
+#include "common/hashfn_unstable.h"
 #include "common/logging.h"
 #include "common/string.h"
 #include "dumputils.h"
@@ -33,8 +33,6 @@
 /* version string we expect back from pg_dump */
 #define PGDUMP_VERSIONSTR "pg_dump (PostgreSQL) " PG_VERSION "\n"
 
-static uint32 hash_string_pointer(char *s);
-
 typedef struct
 {
    uint32      status;
@@ -46,7 +44,7 @@ typedef struct
 #define SH_ELEMENT_TYPE    RoleNameEntry
 #define SH_KEY_TYPE    char *
 #define SH_KEY     rolename
-#define SH_HASH_KEY(tb, key)   hash_string_pointer(key)
+#define SH_HASH_KEY(tb, key)   hash_string(key)
 #define SH_EQUAL(tb, a, b)     (strcmp(a, b) == 0)
 #define SH_STORE_HASH
 #define SH_GET_HASH(tb, a)     (a)->hashval
@@ -1938,17 +1936,6 @@ dumpTimestamp(const char *msg)
        fprintf(OPF, "-- %s %s\n\n", msg, buf);
 }
 
-/*
- * Helper function for rolename_hash hash table.
- */
-static uint32
-hash_string_pointer(char *s)
-{
-   unsigned char *ss = (unsigned char *) s;
-
-   return hash_bytes(ss, strlen(s));
-}
-
 /*
  * read_dumpall_filters - retrieve database identifier patterns from file
  *
index 255ddf2ffaf490e50c1264985fa7258e0859333e..4458324c9d81bb01f504bf4e0b2b49b676d2c19b 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "catalog/pg_tablespace_d.h"
 #include "common/file_utils.h"
-#include "common/hashfn.h"
+#include "common/hashfn_unstable.h"
 #include "common/string.h"
 #include "datapagemap.h"
 #include "filemap.h"
  * Define a hash table which we can use to store information about the files
  * appearing in source and target systems.
  */
-static uint32 hash_string_pointer(const char *s);
 #define SH_PREFIX      filehash
 #define SH_ELEMENT_TYPE    file_entry_t
 #define SH_KEY_TYPE        const char *
 #define    SH_KEY          path
-#define SH_HASH_KEY(tb, key)   hash_string_pointer(key)
+#define SH_HASH_KEY(tb, key)   hash_string(key)
 #define SH_EQUAL(tb, a, b)     (strcmp(a, b) == 0)
 #define    SH_SCOPE        static inline
 #define SH_RAW_ALLOCATOR   pg_malloc0
@@ -821,15 +820,3 @@ decide_file_actions(void)
 
    return filemap;
 }
-
-
-/*
- * Helper function for filemap hash table.
- */
-static uint32
-hash_string_pointer(const char *s)
-{
-   unsigned char *ss = (unsigned char *) s;
-
-   return hash_bytes(ss, strlen(s));
-}
index 48f8b233262a182aa3ba499ac716dac41f184225..90ef4b20379aa252d5a4dd20470f1d363e570082 100644 (file)
@@ -19,7 +19,7 @@
 #include <time.h>
 
 #include "common/controldata_utils.h"
-#include "common/hashfn.h"
+#include "common/hashfn_unstable.h"
 #include "common/logging.h"
 #include "common/parse_manifest.h"
 #include "fe_utils/simple_list.h"
@@ -68,12 +68,11 @@ typedef struct manifest_file
  * Define a hash table which we can use to store information about the files
  * mentioned in the backup manifest.
  */
-static uint32 hash_string_pointer(char *s);
 #define SH_PREFIX      manifest_files
 #define SH_ELEMENT_TYPE    manifest_file
 #define SH_KEY_TYPE        char *
 #define    SH_KEY          pathname
-#define SH_HASH_KEY(tb, key)   hash_string_pointer(key)
+#define SH_HASH_KEY(tb, key)   hash_string(key)
 #define SH_EQUAL(tb, a, b)     (strcmp(a, b) == 0)
 #define    SH_SCOPE        static inline
 #define SH_RAW_ALLOCATOR   pg_malloc0
@@ -1028,17 +1027,6 @@ should_ignore_relpath(verifier_context *context, char *relpath)
    return false;
 }
 
-/*
- * Helper function for manifest_files hash table.
- */
-static uint32
-hash_string_pointer(char *s)
-{
-   unsigned char *ss = (unsigned char *) s;
-
-   return hash_bytes(ss, strlen(s));
-}
-
 /*
  * Print a progress report based on the global variables.
  *
index d7ab6eeefe7d2191e9de22c9bc67f4076a5effcd..c93c9d717924143484d5bae1fed4e536dee61e17 100644 (file)
@@ -370,4 +370,24 @@ fasthash32(const char *k, size_t len, uint64 seed)
    return fasthash_reduce32(fasthash64(k, len, seed));
 }
 
+/*
+ * Convenience function for hashing NUL-terminated strings
+ */
+static inline uint32
+hash_string(const char *s)
+{
+   fasthash_state hs;
+   size_t      s_len;
+
+   fasthash_init(&hs, 0);
+
+   /*
+    * Combine string into the hash and save the length for tweaking the final
+    * mix.
+    */
+   s_len = fasthash_accum_cstring(&hs, s);
+
+   return fasthash_final32(&hs, s_len);
+}
+
 #endif                         /* HASHFN_UNSTABLE_H */