⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashtest.c

📁 harvest是一个下载html网页得机器人
💻 C
字号:
/************************************************************************************************* * Test unit for hash functions *************************************************************************************************/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <assert.h>#define RECBUFSIZ      32#define RANDDATAMIN    4#define RANDDATAMAX    12/* function prototypes */int main(int argc, char **argv);void usage(const char *progname);int setrandstr(char *buf);void printcol(const char *name, int (*hfunc)(const char *, int), int rnum, int bnum);int dpfirsthash(const char *kbuf, int ksiz);int dpsecondhash(const char *kbuf, int ksiz);int dpthirdhash(const char *kbuf, int ksiz);/* main routine */int main(int argc, char **argv){  int rnum, bnum, i, len;  char buf[RECBUFSIZ];  rnum = argc > 1 ? atoi(argv[1]) : -1;  bnum = argc > 2 ? atoi(argv[2]) : -1;  srand(time(NULL));  if(rnum > 0 && bnum > 0){    printf("number of records: %d\n", rnum);    printf("number of buckets: %d\n", bnum);    printcol("dpfirsthash", dpfirsthash, rnum, bnum);    printcol("dpsecondhash", dpsecondhash, rnum, bnum);    printcol("dpthirdhash", dpthirdhash, rnum, bnum);  } else if(rnum > 0){    for(i = 1; i < rnum; i++){      len = sprintf(buf, "%X", i);      printf("%s", buf);      printf("\t%10d", dpfirsthash(buf, len));      printf("\t%10d", dpsecondhash(buf, len));      printf("\t%10d", dpthirdhash(buf, len));      printf("\n");    }  } else {    usage(argv[0]);  }  return 0;}/* show usage and exit */void usage(const char *progname){  fprintf(stderr, "%s: test unit for hash functions\n\n", progname);  fprintf(stderr, "usage:\n");  fprintf(stderr, "  %s rnum bnum  : print collision rate\n", progname);  fprintf(stderr, "  %s rnum       : print values\n", progname);  exit(1);}/* set randum string and return its length */int setrandstr(char *buf){  int i, len;  len = rand() % (RANDDATAMAX - RANDDATAMIN) + RANDDATAMIN + 1;  for(i = 0; i < len; i++){    buf[i] = rand() % 256;  }  buf[len] = '\0';  return len;}/* print collision rate of each hash functioon */void printcol(const char *name, int (*hfunc)(const char *, int), int rnum, int bnum){  int *array, i, len, col;  char buf[RECBUFSIZ];  if(!(array = calloc(bnum, sizeof(int)))) return;  for(i = 1; i <= rnum; i++){    len = setrandstr(buf);    array[hfunc(buf, len) % bnum]++;  }  col = 0;  for(i = 0; i < bnum; i++){    if(array[i] > 1) col += array[i] - 1;  }  printf("collision rate: %5.2f%% (%8d) by %s\n",         ((double)col / (double)rnum) * 100.0, col, name);  free(array);}/* hash function to select a bucket element */int dpfirsthash(const char *kbuf, int ksiz){  const unsigned char *p;  unsigned int sum;  int i;  assert(kbuf && ksiz >= 0);  p = (const unsigned char *)kbuf;  sum = 751;  for(i = 0; i < ksiz; i++){    sum = sum * 31 + p[i];  }  return (sum * 87767623) & 0x7FFFFFFF;}/* hash function to select a right/left node of binary search tree */int dpsecondhash(const char *kbuf, int ksiz){  const unsigned char *p;  unsigned int sum;  int i;  assert(kbuf && ksiz >= 0);  p = (const unsigned char *)kbuf;  sum = 19780211;  for(i = ksiz - 1; i >= 0; i--){    sum = sum * 37 + p[i];  }  return (sum * 43321879) & 0x7FFFFFFF;}/* hash function for its applications */int dpthirdhash(const char *kbuf, int ksiz){  const unsigned char *p;  unsigned int sum;  int i;  assert(kbuf && ksiz >= 0);  p = (const unsigned char *)kbuf;  sum = 774831917;  for(i = ksiz - 1; i >= 0; i--){    sum = sum * 29 + p[i];  }  return (sum * 5157883) & 0x7FFFFFFF;}/* END OF FILE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -