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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * hashfunc.c
  4.  *   Comparison functions for hash access method.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.18.2.1 1999/08/02 05:24:33 scrappy Exp $
  11.  *
  12.  * NOTES
  13.  *   These functions are stored in pg_amproc. For each operator class
  14.  *   defined on hash tables, they compute the hash value of the argument.
  15.  *
  16.  *-------------------------------------------------------------------------
  17.  */
  18. #include "postgres.h"
  19. #include "access/hash.h"
  20. uint32
  21. hashint2(int16 key)
  22. {
  23. return (uint32) ~key;
  24. }
  25. uint32
  26. hashint4(uint32 key)
  27. {
  28. return ~key;
  29. }
  30. uint32
  31. hashint8(int64 *key)
  32. {
  33. return ~((uint32) *key);
  34. }
  35. /* Hash function from Chris Torek. */
  36. uint32
  37. hashfloat4(float32 keyp)
  38. {
  39. int len;
  40. int loop;
  41. uint32 h;
  42. char    *kp = (char *) keyp;
  43. len = sizeof(float32data);
  44. #define HASH4a  h = (h << 5) - h + *kp++;
  45. #define HASH4b  h = (h << 5) + h + *kp++;
  46. #define HASH4 HASH4b
  47. h = 0;
  48. if (len > 0)
  49. {
  50. loop = (len + 8 - 1) >> 3;
  51. switch (len & (8 - 1))
  52. {
  53. case 0:
  54. do
  55. { /* All fall throughs */
  56. HASH4;
  57. case 7:
  58. HASH4;
  59. case 6:
  60. HASH4;
  61. case 5:
  62. HASH4;
  63. case 4:
  64. HASH4;
  65. case 3:
  66. HASH4;
  67. case 2:
  68. HASH4;
  69. case 1:
  70. HASH4;
  71. } while (--loop);
  72. }
  73. }
  74. return h;
  75. }
  76. uint32
  77. hashfloat8(float64 keyp)
  78. {
  79. int len;
  80. int loop;
  81. uint32 h;
  82. char    *kp = (char *) keyp;
  83. len = sizeof(float64data);
  84. #define HASH4a  h = (h << 5) - h + *kp++;
  85. #define HASH4b  h = (h << 5) + h + *kp++;
  86. #define HASH4 HASH4b
  87. h = 0;
  88. if (len > 0)
  89. {
  90. loop = (len + 8 - 1) >> 3;
  91. switch (len & (8 - 1))
  92. {
  93. case 0:
  94. do
  95. { /* All fall throughs */
  96. HASH4;
  97. case 7:
  98. HASH4;
  99. case 6:
  100. HASH4;
  101. case 5:
  102. HASH4;
  103. case 4:
  104. HASH4;
  105. case 3:
  106. HASH4;
  107. case 2:
  108. HASH4;
  109. case 1:
  110. HASH4;
  111. } while (--loop);
  112. }
  113. }
  114. return h;
  115. }
  116. uint32
  117. hashoid(Oid key)
  118. {
  119. return (uint32) ~key;
  120. }
  121. uint32
  122. hashoid8(Oid *key)
  123. {
  124. int i;
  125. uint32 result = 0;
  126. for (i = 0; i < 8; i++)
  127. result = result ^ (~(uint32) key[i]);
  128. return result;
  129. }
  130. #define PRIME1 37
  131. #define PRIME2 1048583
  132. uint32
  133. hashchar(char key)
  134. {
  135. int len;
  136. uint32 h;
  137. h = 0;
  138. len = sizeof(char);
  139. /* Convert char to integer */
  140. h = h * PRIME1 ^ (key - ' ');
  141. h %= PRIME2;
  142. return h;
  143. }
  144. uint32
  145. hashname(NameData *n)
  146. {
  147. uint32 h;
  148. int len;
  149. char    *key;
  150. key = n->data;
  151. h = 0;
  152. len = NAMEDATALEN;
  153. /* Convert string to integer */
  154. while (len--)
  155. h = h * PRIME1 ^ (*key++ - ' ');
  156. h %= PRIME2;
  157. return h;
  158. }
  159. /*
  160.  * (Comment from the original db3 hashing code: )
  161.  *
  162.  * "This is INCREDIBLY ugly, but fast.  We break the string up into 8 byte
  163.  * units.  On the first time through the loop we get the 'leftover bytes'
  164.  * (strlen % 8).  On every other iteration, we perform 8 HASHC's so we handle
  165.  * all 8 bytes.  Essentially, this saves us 7 cmp & branch instructions.  If
  166.  * this routine is heavily used enough, it's worth the ugly coding.
  167.  *
  168.  * "OZ's original sdbm hash"
  169.  */
  170. uint32
  171. hashtext(struct varlena * key)
  172. {
  173. int keylen;
  174. char    *keydata;
  175. uint32 n;
  176. int loop;
  177. keydata = VARDATA(key);
  178. keylen = VARSIZE(key);
  179. /* keylen includes the four bytes in which string keylength is stored */
  180. keylen -= sizeof(VARSIZE(key));
  181. #define HASHC n = *keydata++ + 65599 * n
  182. n = 0;
  183. if (keylen > 0)
  184. {
  185. loop = (keylen + 8 - 1) >> 3;
  186. switch (keylen & (8 - 1))
  187. {
  188. case 0:
  189. do
  190. { /* All fall throughs */
  191. HASHC;
  192. case 7:
  193. HASHC;
  194. case 6:
  195. HASHC;
  196. case 5:
  197. HASHC;
  198. case 4:
  199. HASHC;
  200. case 3:
  201. HASHC;
  202. case 2:
  203. HASHC;
  204. case 1:
  205. HASHC;
  206. } while (--loop);
  207. }
  208. }
  209. return n;
  210. }