kwhash.c
上传用户:hbdengju
上传日期:2007-01-06
资源大小:11k
文件大小:3k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. /* this is a C program */
  2. #include <stdio.h>
  3. static char *keywords[] =
  4.     {
  5.     "asm",
  6.     "auto",
  7.     "break",
  8.     "case",
  9.     "char",
  10.     "class",
  11.     "const",
  12.     "continue",
  13.     "default",
  14.     "delete",
  15.     "do",
  16.     "double",
  17.     "else",
  18.     "enum",
  19.     "extern",
  20.     "float",
  21.     "for",
  22.     "friend",
  23.     "goto",
  24.     "if",
  25.     "inline",
  26.     "int",
  27.     "long",
  28.     "new",
  29.     "operator",
  30.     "overload",
  31.     "private",
  32.     "protected",
  33.     "public",
  34.     "register",
  35.     "return",
  36.     "short",
  37.     "signed",
  38.     "sizeof",
  39.     "static",
  40.     "struct",
  41.     "switch",
  42.     "this",
  43.     "typedef",
  44.     "union",
  45.     "unsigned",
  46.     "virtual",
  47.     "volatile",
  48.     "void",
  49.     "while"
  50.     };
  51. #define KW_NUMKEYS (sizeof(keywords)/sizeof(*keywords))
  52. unsigned int hashsize = 137;
  53. char** kwhash;
  54. typedef unsigned short u_short;
  55. u_short
  56. hash(cp, len, a, b, c)
  57.     unsigned char* cp;
  58.     u_short len;
  59.     u_short a, b, c;
  60.     {
  61.     return (((u_short)cp[0]         ) ^
  62.             ((u_short)cp[1]     << a) ^
  63.             ((u_short)cp[len-1] << b) ^
  64.              (len               << c)  ) % hashsize;
  65.     }
  66. int
  67. insert(cp, a, b, c)
  68.     char *cp;
  69.     u_short a, b, c;
  70.     {
  71.     short h;
  72.     h = hash(cp, strlen(cp), a, b, c);
  73.     if (kwhash[h] != NULL)
  74.         {
  75. /*
  76.         printf("Keyword hash collision: %s, %sn", kwhash[h], cp);
  77. */
  78.         return 0;
  79.         }
  80.     else
  81.         kwhash[h] = cp;
  82.     return 1;
  83.     }
  84. int
  85. try(a, b, c)
  86.     short a, b, c;
  87.     {
  88.     short int i;
  89.     int collisions;
  90.     collisions = 0;
  91.     for (i = 0; i < hashsize; ++i)
  92.         kwhash[i] = NULL;
  93.     for (i = 0; i < KW_NUMKEYS; ++i)
  94.         if (!insert(keywords[i], a, b, c))
  95.             ++collisions;
  96.     return collisions;
  97.     }
  98. main(argc, argv)
  99.     int argc;
  100.     char **argv;
  101.     {
  102.     int min_collisions;
  103.     int min_abc = 0;
  104.     short a, b, c;
  105.     if (argc > 1) hashsize = atoi(argv[1]);
  106.     else
  107.         {
  108.         printf("usage: %s <hash_size>nt<hash_size> should be prime.n",
  109.                 argv[0]);
  110.         exit(-1);
  111.         }
  112.     if (hashsize < KW_NUMKEYS)
  113.         {
  114.         printf("Hash table is too small.n");
  115.         exit(-1);
  116.         }
  117.     kwhash = (char**) malloc(hashsize * sizeof(char*));
  118.     min_collisions = hashsize + 1;
  119.     for (a = 0; a <= 10; ++a)
  120.         {
  121.         for (b = 0; b <= 10; ++b)
  122.             {
  123.             for (c = 0; c <= 10; ++c)
  124.                 {
  125.                 int collisions;
  126.                 collisions = try(a, b, c);
  127.                 if (collisions <= min_collisions)
  128.                     {
  129.                     printf("abc: %03x  Collisions: %2d ",
  130.                            ((a<<8)|(b<<4)|c), collisions);
  131.                     min_collisions = collisions;
  132.                     if (collisions == 0) putchar('*');
  133.                     putchar('n');
  134.                     }
  135.                 }
  136.             }
  137.         }
  138.     }