db_shash.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: db_shash.c,v 11.6 2002/03/01 17:22:16 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. /*
  16.  * Table of good hash values.  Up to ~250,000 buckets, we use powers of 2.
  17.  * After that, we slow the rate of increase by half.  For each choice, we
  18.  * then use a nearby prime number as the hash value.
  19.  *
  20.  * If a terabyte is the maximum cache we'll see, and we assume there are
  21.  * 10 1K buckets on each hash chain, then 107374182 is the maximum number
  22.  * of buckets we'll ever need.
  23.  */
  24. static const struct {
  25. u_int32_t power;
  26. u_int32_t prime;
  27. } list[] = {
  28. {  32, 37}, /* 2^5 */
  29. {  64, 67}, /* 2^6 */
  30. { 128,        131}, /* 2^7 */
  31. { 256,        257}, /* 2^8 */
  32. { 512,        521}, /* 2^9 */
  33. {      1024,       1031}, /* 2^10 */
  34. {      2048,       2053}, /* 2^11 */
  35. {      4096,       4099}, /* 2^12 */
  36. {      8192,       8191}, /* 2^13 */
  37. {     16384,      16381}, /* 2^14 */
  38. {     32768,      32771}, /* 2^15 */
  39. {     65536,      65537}, /* 2^16 */
  40. {    131072,     131071}, /* 2^17 */
  41. {    262144,     262147}, /* 2^18 */
  42. {    393216,     393209}, /* 2^18 + 2^18/2 */
  43. {    524288,     524287}, /* 2^19 */
  44. {    786432,     786431}, /* 2^19 + 2^19/2 */
  45. {   1048576,    1048573}, /* 2^20 */
  46. {   1572864,    1572869}, /* 2^20 + 2^20/2 */
  47. {   2097152,    2097169}, /* 2^21 */
  48. {   3145728,    3145721}, /* 2^21 + 2^21/2 */
  49. {   4194304,    4194301}, /* 2^22 */
  50. {   6291456,    6291449}, /* 2^22 + 2^22/2 */
  51. {   8388608,    8388617}, /* 2^23 */
  52. {  12582912,   12582917}, /* 2^23 + 2^23/2 */
  53. {  16777216,   16777213}, /* 2^24 */
  54. {  25165824,   25165813}, /* 2^24 + 2^24/2 */
  55. {  33554432,   33554393}, /* 2^25 */
  56. {  50331648,   50331653}, /* 2^25 + 2^25/2 */
  57. {  67108864,   67108859}, /* 2^26 */
  58. { 100663296,  100663291}, /* 2^26 + 2^26/2 */
  59. { 134217728,  134217757}, /* 2^27 */
  60. { 201326592,  201326611}, /* 2^27 + 2^27/2 */
  61. { 268435456,  268435459}, /* 2^28 */
  62. { 402653184,  402653189}, /* 2^28 + 2^28/2 */
  63. { 536870912,  536870909}, /* 2^29 */
  64. { 805306368,  805306357}, /* 2^29 + 2^29/2 */
  65. {1073741824, 1073741827}, /* 2^30 */
  66. {0, 0}
  67. };
  68. /*
  69.  * __db_tablesize --
  70.  * Choose a size for the hash table.
  71.  *
  72.  * PUBLIC: int __db_tablesize __P((u_int32_t));
  73.  */
  74. int
  75. __db_tablesize(n_buckets)
  76. u_int32_t n_buckets;
  77. {
  78. int i;
  79. /*
  80.  * We try to be clever about how big we make the hash tables.  Use a
  81.  * prime number close to the "suggested" number of elements that will
  82.  * be in the hash table.  Use 64 as the minimum hash table size.
  83.  *
  84.  * Ref: Sedgewick, Algorithms in C, "Hash Functions"
  85.  */
  86. if (n_buckets < 32)
  87. n_buckets = 32;
  88. for (i = 0;; ++i) {
  89. if (list[i].power == 0) {
  90. --i;
  91. break;
  92. }
  93. if (list[i].power >= n_buckets)
  94. break;
  95. }
  96. return (list[i].prime);
  97. }
  98. /*
  99.  * __db_hashinit --
  100.  * Initialize a hash table that resides in shared memory.
  101.  *
  102.  * PUBLIC: void __db_hashinit __P((void *, u_int32_t));
  103.  */
  104. void
  105. __db_hashinit(begin, nelements)
  106. void *begin;
  107. u_int32_t nelements;
  108. {
  109. u_int32_t i;
  110. SH_TAILQ_HEAD(hash_head) *headp;
  111. headp = (struct hash_head *)begin;
  112. for (i = 0; i < nelements; i++, headp++)
  113. SH_TAILQ_INIT(headp);
  114. }