ut0rnd.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*******************************************************************
  2. Random numbers and hashing
  3. (c) 1994, 1995 Innobase Oy
  4. Created 5/11/1994 Heikki Tuuri
  5. ********************************************************************/
  6. #include "ut0rnd.h"
  7. #ifdef UNIV_NONINL
  8. #include "ut0rnd.ic"
  9. #endif
  10. /* These random numbers are used in ut_find_prime */
  11. #define UT_RANDOM_1 1.0412321
  12. #define UT_RANDOM_2 1.1131347
  13. #define UT_RANDOM_3 1.0132677
  14. ulint ut_rnd_ulint_counter = 65654363;
  15. /***************************************************************
  16. Looks for a prime number slightly greater than the given argument.
  17. The prime is chosen so that it is not near any power of 2. */
  18. ulint
  19. ut_find_prime(
  20. /*==========*/
  21. /* out: prime */
  22. ulint n) /* in: positive number > 100 */
  23. {
  24. ulint pow2;
  25. ulint i;
  26. n += 100;
  27. pow2 = 1;
  28. while (pow2 * 2 < n) {
  29. pow2 = 2 * pow2;
  30. }
  31. if ((double)n < 1.05 * (double)pow2) {
  32. n = (ulint) ((double)n * UT_RANDOM_1);
  33. }
  34. pow2 = 2 * pow2;
  35. if ((double)n > 0.95 * (double)pow2) {
  36. n = (ulint) ((double)n * UT_RANDOM_2);
  37. }
  38. if (n > pow2 - 20) {
  39. n += 30;
  40. }
  41. /* Now we have n far enough from powers of 2. To make
  42. n more random (especially, if it was not near 
  43. a power of 2), we then multiply it by a random number. */ 
  44. n = (ulint) ((double)n * UT_RANDOM_3);
  45. for (;; n++) {
  46. i = 2;
  47. while (i * i <= n) {
  48. if (n % i == 0) {
  49. goto next_n;
  50. }
  51. i++;
  52. }
  53. /* Found a prime */
  54. break;
  55. next_n: ;
  56. }
  57. return(n);
  58. }