📄 hsearch.h
字号:
/*------------------------------------------------------------------------- * * hsearch.h * for hashing in the new buffer manager * * * Copyright (c) 1994, Regents of the University of California * * $Id: hsearch.h,v 1.12 1999/05/25 16:14:54 momjian Exp $ * *------------------------------------------------------------------------- */#ifndef HSEARCH_H#define HSEARCH_H/* * Constants * * A hash table has a top-level "directory", each of whose entries points * to a "segment" of ssize bucket headers. The maximum number of hash * buckets is thus dsize * ssize (but dsize may be expansible). Of course, * the number of records in the table can be larger, but we don't want a * whole lot of records per bucket or performance goes down. * * In a hash table allocated in shared memory, the directory cannot be * expanded because it must stay at a fixed address. */#define DEF_SEGSIZE 256#define DEF_SEGSIZE_SHIFT 8/* log2(SEGSIZE) */#define DEF_DIRSIZE 256#define DEF_FFACTOR 1/* default fill factor */#define PRIME1 37 /* for the hash function */#define PRIME2 1048583/* * Hash bucket is actually bigger than this. Key field can have * variable length and a variable length data field follows it. */typedef struct element{ unsigned long next; /* secret from user */ long key;} ELEMENT;typedef unsigned long BUCKET_INDEX;/* segment is an array of bucket pointers */typedef BUCKET_INDEX *SEGMENT;typedef unsigned long SEG_OFFSET;typedef struct hashhdr{ long dsize; /* Directory Size */ long ssize; /* Segment Size --- must be power of 2 */ long sshift; /* Segment shift */ long max_bucket; /* ID of Maximum bucket in use */ long high_mask; /* Mask to modulo into entire table */ long low_mask; /* Mask to modulo into lower half of table */ long ffactor; /* Fill factor */ long nkeys; /* Number of keys in hash table */ long nsegs; /* Number of allocated segments */ long keysize; /* hash key length in bytes */ long datasize; /* elem data length in bytes */ long max_dsize; /* 'dsize' limit if directory is fixed * size */ BUCKET_INDEX freeBucketIndex; /* index of first free bucket */#ifdef HASH_STATISTICS long accesses; long collisions;#endif} HHDR;typedef struct htab{ HHDR *hctl; /* shared control information */ long (*hash) (); /* Hash Function */ char *segbase; /* segment base address for calculating * pointer values */ SEG_OFFSET *dir; /* 'directory' of segm starts */ long *(*alloc) (); /* memory allocator (long * for alignment * reasons) */} HTAB;typedef struct hashctl{ long ssize; /* Segment Size */ long dsize; /* Dirsize Size */ long ffactor; /* Fill factor */ long (*hash) (); /* Hash Function */ long keysize; /* hash key length in bytes */ long datasize; /* elem data length in bytes */ long max_dsize; /* limit to dsize if directory size is * limited */ long *segbase; /* base for calculating bucket + seg ptrs */ long *(*alloc) (); /* memory allocation function */ long *dir; /* directory if allocated already */ long *hctl; /* location of header information in shd * mem */} HASHCTL;/* Flags to indicate action for hctl */#define HASH_SEGMENT 0x002 /* Setting segment size */#define HASH_DIRSIZE 0x004 /* Setting directory size */#define HASH_FFACTOR 0x008 /* Setting fill factor */#define HASH_FUNCTION 0x010 /* Set user defined hash function */#define HASH_ELEM 0x020 /* Setting key/data size */#define HASH_SHARED_MEM 0x040 /* Setting shared mem const */#define HASH_ATTACH 0x080 /* Do not initialize hctl */#define HASH_ALLOC 0x100 /* Setting memory allocator *//* seg_alloc assumes that INVALID_INDEX is 0*/#define INVALID_INDEX (0)#define NO_MAX_DSIZE (-1)/* number of hash buckets allocated at once */#define BUCKET_ALLOC_INCR (30)/* hash_search operations */typedef enum{ HASH_FIND, HASH_ENTER, HASH_REMOVE, HASH_FIND_SAVE, HASH_REMOVE_SAVED} HASHACTION;/* * prototypes from functions in dynahash.c */extern HTAB *hash_create(int nelem, HASHCTL *info, int flags);extern void hash_destroy(HTAB *hashp);extern void hash_stats(char *where, HTAB *hashp);extern long *hash_search(HTAB *hashp, char *keyPtr, HASHACTION action, bool *foundPtr);extern long *hash_seq(HTAB *hashp);extern long hash_estimate_size(long num_entries, long keysize, long datasize);/* * prototypes from functions in hashfn.c */extern long string_hash(char *key, int keysize);extern long tag_hash(int *key, int keysize);#endif /* HSEARCH_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -