Commit af38498d authored by Alvaro Herrera's avatar Alvaro Herrera

Move hash_any prototype from access/hash.h to utils/hashutils.h

... as well as its implementation from backend/access/hash/hashfunc.c to
backend/utils/hash/hashfn.c.

access/hash is the place for the hash index AM, not really appropriate
for generic facilities, which is what hash_any is; having things the old
way meant that anything using hash_any had to include the AM's include
file, pointlessly polluting its namespace with unrelated, unnecessary
cruft.

Also move the HTEqual strategy number to access/stratnum.h from
access/hash.h.

To avoid breaking third-party extension code, add an #include
"utils/hashutils.h" to access/hash.h.  (An easily removed line by
committers who enjoy their asbestos suits to protect them from angry
extension authors.)

Discussion: https://postgr.es/m/201901251935.ser5e4h6djt2@alvherre.pgsql
parent b212245f
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/formatting.h" #include "utils/formatting.h"
#include "utils/hashutils.h"
#include "utils/varlena.h" #include "utils/varlena.h"
PG_MODULE_MAGIC; PG_MODULE_MAGIC;
......
...@@ -3,11 +3,11 @@ ...@@ -3,11 +3,11 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "funcapi.h" #include "funcapi.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "hstore.h" #include "hstore.h"
......
...@@ -61,7 +61,6 @@ ...@@ -61,7 +61,6 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include "access/hash.h"
#include "catalog/pg_authid.h" #include "catalog/pg_authid.h"
#include "executor/instrument.h" #include "executor/instrument.h"
#include "funcapi.h" #include "funcapi.h"
...@@ -78,6 +77,7 @@ ...@@ -78,6 +77,7 @@
#include "tcop/utility.h" #include "tcop/utility.h"
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
#include "utils/memutils.h" #include "utils/memutils.h"
PG_MODULE_MAGIC; PG_MODULE_MAGIC;
......
...@@ -12,11 +12,11 @@ ...@@ -12,11 +12,11 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "catalog/pg_proc.h" #include "catalog/pg_proc.h"
#include "commands/seclabel.h" #include "commands/seclabel.h"
#include "storage/ipc.h" #include "storage/ipc.h"
#include "utils/guc.h" #include "utils/guc.h"
#include "utils/hashutils.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "sepgsql.h" #include "sepgsql.h"
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "access/tupdesc_details.h" #include "access/tupdesc_details.h"
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
......
This diff is collapsed.
...@@ -26,11 +26,11 @@ ...@@ -26,11 +26,11 @@
#include <math.h> #include <math.h>
#include "access/hash.h"
#include "access/tsmapi.h" #include "access/tsmapi.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "optimizer/optimizer.h" #include "optimizer/optimizer.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
/* Private state */ /* Private state */
......
...@@ -26,13 +26,13 @@ ...@@ -26,13 +26,13 @@
#include <math.h> #include <math.h>
#include "access/hash.h"
#include "access/heapam.h" #include "access/heapam.h"
#include "access/relscan.h" #include "access/relscan.h"
#include "access/tsmapi.h" #include "access/tsmapi.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "optimizer/optimizer.h" #include "optimizer/optimizer.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
/* Private state */ /* Private state */
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include "miscadmin.h" #include "miscadmin.h"
#include "access/genam.h" #include "access/genam.h"
#include "access/hash.h"
#include "access/heapam.h" #include "access/heapam.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "access/xact.h" #include "access/xact.h"
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include "miscadmin.h" #include "miscadmin.h"
#include "access/genam.h" #include "access/genam.h"
#include "access/hash.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "access/table.h" #include "access/table.h"
#include "access/xact.h" #include "access/xact.h"
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "access/parallel.h" #include "access/parallel.h"
#include "executor/executor.h" #include "executor/executor.h"
#include "miscadmin.h" #include "miscadmin.h"
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "access/heapam.h" #include "access/heapam.h"
#include "access/relscan.h" #include "access/relscan.h"
#include "access/tsmapi.h" #include "access/tsmapi.h"
...@@ -22,6 +21,7 @@ ...@@ -22,6 +21,7 @@
#include "executor/nodeSamplescan.h" #include "executor/nodeSamplescan.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "pgstat.h" #include "pgstat.h"
#include "storage/bufmgr.h"
#include "storage/predicate.h" #include "storage/predicate.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/rel.h" #include "utils/rel.h"
......
...@@ -35,9 +35,9 @@ ...@@ -35,9 +35,9 @@
#include <math.h> #include <math.h>
#include "access/hash.h"
#include "lib/bloomfilter.h" #include "lib/bloomfilter.h"
#include "port/pg_bitutils.h" #include "port/pg_bitutils.h"
#include "utils/hashutils.h"
#define MAX_HASH_FUNCS 10 #define MAX_HASH_FUNCS 10
......
...@@ -20,9 +20,10 @@ ...@@ -20,9 +20,10 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h" #include "nodes/bitmapset.h"
#include "nodes/pg_list.h" #include "nodes/pg_list.h"
#include "port/pg_bitutils.h" #include "port/pg_bitutils.h"
#include "utils/hashutils.h"
#define WORDNUM(x) ((x) / BITS_PER_BITMAPWORD) #define WORDNUM(x) ((x) / BITS_PER_BITMAPWORD)
......
...@@ -18,13 +18,15 @@ ...@@ -18,13 +18,15 @@
#include "postgres.h" #include "postgres.h"
#include "access/hash.h" #include <limits.h>
#include "catalog/pg_tablespace.h" #include "catalog/pg_tablespace.h"
#include "commands/tablespace.h" #include "commands/tablespace.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "storage/dsm.h" #include "storage/dsm.h"
#include "storage/sharedfileset.h" #include "storage/sharedfileset.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
static void SharedFileSetOnDetach(dsm_segment *segment, Datum datum); static void SharedFileSetOnDetach(dsm_segment *segment, Datum datum);
static void SharedFileSetPath(char *path, SharedFileSet *fileset, Oid tablespace); static void SharedFileSetPath(char *path, SharedFileSet *fileset, Oid tablespace);
......
...@@ -13,12 +13,12 @@ ...@@ -13,12 +13,12 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "catalog/pg_operator.h" #include "catalog/pg_operator.h"
#include "commands/vacuum.h" #include "commands/vacuum.h"
#include "tsearch/ts_type.h" #include "tsearch/ts_type.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
/* A hash key for lexemes */ /* A hash key for lexemes */
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <ctype.h> #include <ctype.h>
#include "access/hash.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
...@@ -33,6 +32,7 @@ ...@@ -33,6 +32,7 @@
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/catcache.h" #include "utils/catcache.h"
#include "utils/hashutils.h"
#include "utils/inval.h" #include "utils/inval.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/memutils.h" #include "utils/memutils.h"
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <ctype.h> #include <ctype.h>
#include <math.h> #include <math.h>
#include "access/hash.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "funcapi.h" #include "funcapi.h"
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <float.h> #include <float.h>
#include <time.h> #include <time.h>
#include "access/hash.h"
#include "access/xact.h" #include "access/xact.h"
#include "libpq/pqformat.h" #include "libpq/pqformat.h"
#include "miscadmin.h" #include "miscadmin.h"
...@@ -30,6 +29,7 @@ ...@@ -30,6 +29,7 @@
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/date.h" #include "utils/date.h"
#include "utils/datetime.h" #include "utils/datetime.h"
#include "utils/hashutils.h"
#include "utils/sortsupport.h" #include "utils/sortsupport.h"
/* /*
......
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
#include "postgres.h" #include "postgres.h"
#include "access/gin.h" #include "access/gin.h"
#include "access/hash.h"
#include "access/stratnum.h" #include "access/stratnum.h"
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
#include "utils/jsonb.h" #include "utils/jsonb.h"
#include "utils/varlena.h" #include "utils/varlena.h"
......
...@@ -13,10 +13,10 @@ ...@@ -13,10 +13,10 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
#include "utils/jsonb.h" #include "utils/jsonb.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "utils/varlena.h" #include "utils/varlena.h"
......
...@@ -13,12 +13,12 @@ ...@@ -13,12 +13,12 @@
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "lib/hyperloglog.h" #include "lib/hyperloglog.h"
#include "libpq/pqformat.h" #include "libpq/pqformat.h"
#include "port/pg_bswap.h" #include "port/pg_bswap.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/guc.h" #include "utils/guc.h"
#include "utils/hashutils.h"
#include "utils/inet.h" #include "utils/inet.h"
#include "utils/sortsupport.h" #include "utils/sortsupport.h"
......
...@@ -21,9 +21,9 @@ ...@@ -21,9 +21,9 @@
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "libpq/pqformat.h" #include "libpq/pqformat.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
#include "utils/inet.h" #include "utils/inet.h"
/* /*
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include "access/hash.h" #include "access/stratnum.h"
#include "catalog/pg_opfamily.h" #include "catalog/pg_opfamily.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "common/ip.h" #include "common/ip.h"
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "nodes/supportnodes.h" #include "nodes/supportnodes.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/fmgroids.h" #include "utils/fmgroids.h"
#include "utils/hashutils.h"
#include "utils/inet.h" #include "utils/inet.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <limits.h> #include <limits.h>
#include <math.h> #include <math.h>
#include "access/hash.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "common/int.h" #include "common/int.h"
#include "funcapi.h" #include "funcapi.h"
...@@ -39,6 +38,7 @@ ...@@ -39,6 +38,7 @@
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/float.h" #include "utils/float.h"
#include "utils/guc.h" #include "utils/guc.h"
#include "utils/hashutils.h"
#include "utils/int8.h" #include "utils/int8.h"
#include "utils/numeric.h" #include "utils/numeric.h"
#include "utils/sortsupport.h" #include "utils/sortsupport.h"
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "funcapi.h" #include "funcapi.h"
#include "libpq/pqformat.h" #include "libpq/pqformat.h"
#include "utils/builtins.h" #include "utils/builtins.h"
......
...@@ -30,12 +30,13 @@ ...@@ -30,12 +30,13 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h" #include "access/tupmacs.h"
#include "lib/stringinfo.h" #include "lib/stringinfo.h"
#include "libpq/pqformat.h" #include "libpq/pqformat.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/date.h" #include "utils/date.h"
#include "utils/hashutils.h"
#include "utils/int8.h" #include "utils/int8.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/rangetypes.h" #include "utils/rangetypes.h"
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <math.h> #include <math.h>
#include <limits.h> #include <limits.h>
#include "access/hash.h"
#include "access/heapam.h" #include "access/heapam.h"
#include "access/sysattr.h" #include "access/sysattr.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
...@@ -30,6 +29,7 @@ ...@@ -30,6 +29,7 @@
#include "parser/parsetree.h" #include "parser/parsetree.h"
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
#include "utils/rel.h" #include "utils/rel.h"
#include "utils/snapmgr.h" #include "utils/snapmgr.h"
#include "utils/varlena.h" #include "utils/varlena.h"
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <limits.h> #include <limits.h>
#include <sys/time.h> #include <sys/time.h>
#include "access/hash.h"
#include "access/xact.h" #include "access/xact.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "common/int128.h" #include "common/int128.h"
......
...@@ -13,12 +13,12 @@ ...@@ -13,12 +13,12 @@
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "lib/hyperloglog.h" #include "lib/hyperloglog.h"
#include "libpq/pqformat.h" #include "libpq/pqformat.h"
#include "port/pg_bswap.h" #include "port/pg_bswap.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/guc.h" #include "utils/guc.h"
#include "utils/hashutils.h"
#include "utils/sortsupport.h" #include "utils/sortsupport.h"
#include "utils/uuid.h" #include "utils/uuid.h"
......
...@@ -14,8 +14,6 @@ ...@@ -14,8 +14,6 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "access/tuptoaster.h" #include "access/tuptoaster.h"
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
...@@ -24,6 +22,7 @@ ...@@ -24,6 +22,7 @@
#include "nodes/supportnodes.h" #include "nodes/supportnodes.h"
#include "utils/array.h" #include "utils/array.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/hashutils.h"
#include "utils/varlena.h" #include "utils/varlena.h"
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <ctype.h> #include <ctype.h>
#include <limits.h> #include <limits.h>
#include "access/hash.h"
#include "access/tuptoaster.h" #include "access/tuptoaster.h"
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
...@@ -30,6 +29,7 @@ ...@@ -30,6 +29,7 @@
#include "regex/regex.h" #include "regex/regex.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/bytea.h" #include "utils/bytea.h"
#include "utils/hashutils.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "utils/pg_locale.h" #include "utils/pg_locale.h"
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include "postgres.h" #include "postgres.h"
#include "access/genam.h" #include "access/genam.h"
#include "access/hash.h"
#include "access/relscan.h" #include "access/relscan.h"
#include "access/sysattr.h" #include "access/sysattr.h"
#include "access/table.h" #include "access/table.h"
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include "access/hash.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "access/multixact.h" #include "access/multixact.h"
#include "access/nbtree.h" #include "access/nbtree.h"
......
This diff is collapsed.
...@@ -20,11 +20,12 @@ ...@@ -20,11 +20,12 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/hash.h"
#include "jit/jit.h" #include "jit/jit.h"
#include "storage/bufmgr.h"
#include "storage/ipc.h" #include "storage/ipc.h"
#include "storage/predicate.h" #include "storage/predicate.h"
#include "storage/proc.h" #include "storage/proc.h"
#include "utils/hashutils.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "utils/rel.h" #include "utils/rel.h"
#include "utils/resowner_private.h" #include "utils/resowner_private.h"
......
...@@ -96,9 +96,9 @@ ...@@ -96,9 +96,9 @@
#include <limits.h> #include <limits.h>
#include "access/hash.h"
#include "access/htup_details.h" #include "access/htup_details.h"
#include "access/nbtree.h" #include "access/nbtree.h"
#include "access/hash.h"
#include "catalog/index.h" #include "catalog/index.h"
#include "catalog/pg_am.h" #include "catalog/pg_am.h"
#include "commands/tablespace.h" #include "commands/tablespace.h"
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "lib/stringinfo.h" #include "lib/stringinfo.h"
#include "storage/bufmgr.h" #include "storage/bufmgr.h"
#include "storage/lockdefs.h" #include "storage/lockdefs.h"
#include "utils/hashutils.h"
#include "utils/hsearch.h" #include "utils/hsearch.h"
#include "utils/relcache.h" #include "utils/relcache.h"
...@@ -38,17 +39,6 @@ typedef uint32 Bucket; ...@@ -38,17 +39,6 @@ typedef uint32 Bucket;
#define BUCKET_TO_BLKNO(metap,B) \ #define BUCKET_TO_BLKNO(metap,B) \
((BlockNumber) ((B) + ((B) ? (metap)->hashm_spares[_hash_spareindex((B)+1)-1] : 0)) + 1) ((BlockNumber) ((B) + ((B) ? (metap)->hashm_spares[_hash_spareindex((B)+1)-1] : 0)) + 1)
/*
* Rotate the high 32 bits and the low 32 bits separately. The standard
* hash function sometimes rotates the low 32 bits by one bit when
* combining elements. We want extended hash functions to be compatible with
* that algorithm when the seed is 0, so we can't just do a normal rotation.
* This works, though.
*/
#define ROTATE_HIGH_AND_LOW_32BITS(v) \
((((v) << 1) & UINT64CONST(0xfffffffefffffffe)) | \
(((v) >> 31) & UINT64CONST(0x100000001)))
/* /*
* Special space for hash index pages. * Special space for hash index pages.
* *
...@@ -333,12 +323,6 @@ typedef HashMetaPageData *HashMetaPage; ...@@ -333,12 +323,6 @@ typedef HashMetaPageData *HashMetaPage;
#define HASH_WRITE BUFFER_LOCK_EXCLUSIVE #define HASH_WRITE BUFFER_LOCK_EXCLUSIVE
#define HASH_NOLOCK (-1) #define HASH_NOLOCK (-1)
/*
* Strategy number. There's only one valid strategy for hashing: equality.
*/
#define HTEqualStrategyNumber 1
#define HTMaxStrategyNumber 1
/* /*
* When a new operator class is declared, we require that the user supply * When a new operator class is declared, we require that the user supply
* us with an amproc function for hashing a key of the new type, returning * us with an amproc function for hashing a key of the new type, returning
...@@ -380,12 +364,6 @@ extern IndexBulkDeleteResult *hashvacuumcleanup(IndexVacuumInfo *info, ...@@ -380,12 +364,6 @@ extern IndexBulkDeleteResult *hashvacuumcleanup(IndexVacuumInfo *info,
extern bytea *hashoptions(Datum reloptions, bool validate); extern bytea *hashoptions(Datum reloptions, bool validate);
extern bool hashvalidate(Oid opclassoid); extern bool hashvalidate(Oid opclassoid);
extern Datum hash_any(register const unsigned char *k, register int keylen);
extern Datum hash_any_extended(register const unsigned char *k,
register int keylen, uint64 seed);
extern Datum hash_uint32(uint32 k);
extern Datum hash_uint32_extended(uint32 k, uint64 seed);
/* private routines */ /* private routines */
/* hashinsert.c */ /* hashinsert.c */
......
...@@ -34,6 +34,13 @@ typedef uint16 StrategyNumber; ...@@ -34,6 +34,13 @@ typedef uint16 StrategyNumber;
#define BTMaxStrategyNumber 5 #define BTMaxStrategyNumber 5
/*
* Strategy numbers for hash indexes. There's only one valid strategy for
* hashing: equality.
*/
#define HTEqualStrategyNumber 1
#define HTMaxStrategyNumber 1
/* /*
* Strategy numbers common to (some) GiST, SP-GiST and BRIN opclasses. * Strategy numbers common to (some) GiST, SP-GiST and BRIN opclasses.
......
...@@ -7,6 +7,25 @@ ...@@ -7,6 +7,25 @@
#ifndef HASHUTILS_H #ifndef HASHUTILS_H
#define HASHUTILS_H #define HASHUTILS_H
/*
* Rotate the high 32 bits and the low 32 bits separately. The standard
* hash function sometimes rotates the low 32 bits by one bit when
* combining elements. We want extended hash functions to be compatible with
* that algorithm when the seed is 0, so we can't just do a normal rotation.
* This works, though.
*/
#define ROTATE_HIGH_AND_LOW_32BITS(v) \
((((v) << 1) & UINT64CONST(0xfffffffefffffffe)) | \
(((v) >> 31) & UINT64CONST(0x100000001)))
extern Datum hash_any(register const unsigned char *k, register int keylen);
extern Datum hash_any_extended(register const unsigned char *k,
register int keylen, uint64 seed);
extern Datum hash_uint32(uint32 k);
extern Datum hash_uint32_extended(uint32 k, uint64 seed);
/* /*
* Combine two 32-bit hash values, resulting in another hash value, with * Combine two 32-bit hash values, resulting in another hash value, with
* decent bit mixing. * decent bit mixing.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment