hsearch.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * hsearch.h
  4.  *   for hashing in the new buffer manager
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: hsearch.h,v 1.12 1999/05/25 16:14:54 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef HSEARCH_H
  14. #define HSEARCH_H
  15. /*
  16.  * Constants
  17.  *
  18.  * A hash table has a top-level "directory", each of whose entries points
  19.  * to a "segment" of ssize bucket headers. The maximum number of hash
  20.  * buckets is thus dsize * ssize (but dsize may be expansible).  Of course,
  21.  * the number of records in the table can be larger, but we don't want a
  22.  * whole lot of records per bucket or performance goes down.
  23.  *
  24.  * In a hash table allocated in shared memory, the directory cannot be
  25.  * expanded because it must stay at a fixed address.
  26.  */
  27. #define DEF_SEGSIZE    256
  28. #define DEF_SEGSIZE_SHIFT    8/* log2(SEGSIZE)  */
  29. #define DEF_DIRSIZE    256
  30. #define DEF_FFACTOR    1/* default fill factor */
  31. #define PRIME1    37 /* for the hash function */
  32. #define PRIME2    1048583
  33. /*
  34.  * Hash bucket is actually bigger than this.  Key field can have
  35.  * variable length and a variable length data field follows it.
  36.  */
  37. typedef struct element
  38. {
  39. unsigned long next; /* secret from user  */
  40. long key;
  41. } ELEMENT;
  42. typedef unsigned long BUCKET_INDEX;
  43. /* segment is an array of bucket pointers  */
  44. typedef BUCKET_INDEX *SEGMENT;
  45. typedef unsigned long SEG_OFFSET;
  46. typedef struct hashhdr
  47. {
  48. long dsize; /* Directory Size */
  49. long ssize; /* Segment Size --- must be power of 2 */
  50. long sshift; /* Segment shift */
  51. long max_bucket; /* ID of Maximum bucket in use */
  52. long high_mask; /* Mask to modulo into entire table */
  53. long low_mask; /* Mask to modulo into lower half of table */
  54. long ffactor; /* Fill factor */
  55. long nkeys; /* Number of keys in hash table */
  56. long nsegs; /* Number of allocated segments */
  57. long keysize; /* hash key length in bytes */
  58. long datasize; /* elem data length in bytes */
  59. long max_dsize; /* 'dsize' limit if directory is fixed
  60.  * size */
  61. BUCKET_INDEX freeBucketIndex;
  62. /* index of first free bucket */
  63. #ifdef HASH_STATISTICS
  64. long accesses;
  65. long collisions;
  66. #endif
  67. } HHDR;
  68. typedef struct htab
  69. {
  70. HHDR    *hctl; /* shared control information */
  71. long (*hash) (); /* Hash Function */
  72. char    *segbase; /* segment base address for calculating
  73.  * pointer values */
  74. SEG_OFFSET *dir; /* 'directory' of segm starts */
  75. long    *(*alloc) (); /* memory allocator (long * for alignment
  76.  * reasons) */
  77. } HTAB;
  78. typedef struct hashctl
  79. {
  80. long ssize; /* Segment Size */
  81. long dsize; /* Dirsize Size */
  82. long ffactor; /* Fill factor */
  83. long (*hash) (); /* Hash Function */
  84. long keysize; /* hash key length in bytes */
  85. long datasize; /* elem data length in bytes */
  86. long max_dsize; /* limit to dsize if directory size is
  87.  * limited */
  88. long    *segbase; /* base for calculating bucket + seg ptrs */
  89. long    *(*alloc) (); /* memory allocation function */
  90. long    *dir; /* directory if allocated already */
  91. long    *hctl; /* location of header information in shd
  92.  * mem */
  93. } HASHCTL;
  94. /* Flags to indicate action for hctl */
  95. #define HASH_SEGMENT 0x002 /* Setting segment size */
  96. #define HASH_DIRSIZE 0x004 /* Setting directory size */
  97. #define HASH_FFACTOR 0x008 /* Setting fill factor */
  98. #define HASH_FUNCTION 0x010 /* Set user defined hash function */
  99. #define HASH_ELEM 0x020 /* Setting key/data size */
  100. #define HASH_SHARED_MEM 0x040 /* Setting shared mem const */
  101. #define HASH_ATTACH 0x080 /* Do not initialize hctl */
  102. #define HASH_ALLOC 0x100 /* Setting memory allocator */
  103. /* seg_alloc assumes that INVALID_INDEX is 0*/
  104. #define INVALID_INDEX (0)
  105. #define NO_MAX_DSIZE (-1)
  106. /* number of hash buckets allocated at once */
  107. #define BUCKET_ALLOC_INCR (30)
  108. /* hash_search operations */
  109. typedef enum
  110. {
  111. HASH_FIND,
  112. HASH_ENTER,
  113. HASH_REMOVE,
  114. HASH_FIND_SAVE,
  115. HASH_REMOVE_SAVED
  116. } HASHACTION;
  117. /*
  118.  * prototypes from functions in dynahash.c
  119.  */
  120. extern HTAB *hash_create(int nelem, HASHCTL *info, int flags);
  121. extern void hash_destroy(HTAB *hashp);
  122. extern void hash_stats(char *where, HTAB *hashp);
  123. extern long *hash_search(HTAB *hashp, char *keyPtr, HASHACTION action,
  124. bool *foundPtr);
  125. extern long *hash_seq(HTAB *hashp);
  126. extern long hash_estimate_size(long num_entries, long keysize, long datasize);
  127. /*
  128.  * prototypes from functions in hashfn.c
  129.  */
  130. extern long string_hash(char *key, int keysize);
  131. extern long tag_hash(int *key, int keysize);
  132. #endif  /* HSEARCH_H */