hash.c
上传用户:qin5330
上传日期:2007-01-05
资源大小:114k
文件大小:5k
源码类别:

搜索引擎

开发平台:

Perl

  1. /*
  2. ** Copyright (C) 1995, 1996, 1997, 1998 Hewlett-Packard Company
  3. ** Originally by Kevin Hughes, kev@kevcom.com, 3/11/94
  4. **
  5. ** This program and library is free software; you can redistribute it and/or
  6. ** modify it under the terms of the GNU (Library) General Public License
  7. ** as published by the Free Software Foundation; either version 2
  8. ** of the License, or any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU (Library) General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU (Library) General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18. **---------------------------------------------------------
  19. ** Added addStopList to support printing of common words
  20. ** G. Hill 4/7/97  ghill@library.berkeley.edu
  21. */
  22. #include "swish.h"
  23. #include "hash.h"
  24. #include "mem.h"
  25. #include "string.h"
  26. /* Hashes a string.
  27. */
  28. unsigned hash(s)
  29. char *s;
  30. {
  31. unsigned hashval;
  32. for (hashval = 0; *s != ''; s++)
  33. hashval = *s + 31 * hashval;
  34. return hashval % HASHSIZE;
  35. }
  36. /* Hashes a string for a larger hash table.
  37. */
  38. unsigned bighash(s)
  39. char *s;
  40. {
  41. unsigned hashval;
  42. for (hashval = 0; *s != ''; s++)
  43. hashval = *s + 31 * hashval;
  44. return hashval % BIGHASHSIZE;
  45. }
  46. /* Reads the internal list of default stopwords.
  47. */
  48. void readdefaultstopwords()
  49. {
  50. int i;
  51. for (i = 0; defaultstopwords[i] != NULL; i++)
  52. addstophash(defaultstopwords[i]);
  53. }
  54. /* Adds a stop word to the list of removed common words
  55. */
  56. void addStopList(word)
  57. char * word;
  58. {
  59. char* arrayWord;
  60. if (isstopword(word) )
  61. return;
  62. arrayWord = (char *) mystrdup (word);
  63. stopList[stopPos++] = arrayWord;
  64. }
  65. /* Adds a stop word to a hash table.
  66. */
  67. void addstophash(word)
  68. char *word;
  69. {
  70. unsigned hashval;
  71. struct swline *sp;
  72. if (isstopword(word))
  73. return;
  74. sp = (struct swline *) emalloc(sizeof(struct swline));
  75. sp->line = (char *) mystrdup(word);
  76. hashval = hash(word);
  77. sp->next = hashstoplist[hashval];
  78. hashstoplist[hashval] = sp;
  79. }
  80. /* Sees if a word is a stop word by looking it up in the hash table.
  81. */
  82. int isstopword(word)
  83. char *word;
  84. {
  85. unsigned hashval;
  86. struct swline *sp;
  87. hashval = hash(word);
  88. sp = hashstoplist[hashval];
  89. while (sp != NULL) {
  90. if (!strcmp(sp->line, word))
  91. return 1;
  92. sp = sp->next;
  93. }
  94. return 0;
  95. }
  96. /* Adds a file number and its associated file location
  97. ** to a hash table.
  98. */
  99. void addtofilehashlist(fileshort, filelong)
  100. int fileshort;
  101. long filelong;
  102. {
  103. unsigned hashval;
  104. struct filenum *fp;
  105. char tmpstr[MAXSTRLEN];
  106. fp = (struct filenum *) emalloc(sizeof(struct filenum));
  107. fp->fileshort = fileshort;
  108. fp->filelong = filelong;
  109. sprintf(tmpstr, "%d", fileshort);
  110. hashval = bighash(tmpstr);
  111. fp->next = filehashlist[hashval];
  112. filehashlist[hashval] = fp;
  113. }
  114. /* Looks up a file number in the hash table and
  115. ** returns the file position of the associated file info.
  116. */
  117. long getfilenum(filenum)
  118. int filenum;
  119. {
  120. unsigned hashval;
  121. struct filenum *fp;
  122. char tmpstr[MAXSTRLEN];
  123. sprintf(tmpstr, "%d", filenum);
  124. hashval = bighash(tmpstr);
  125. fp = filehashlist[hashval];
  126. while (fp != NULL) {
  127. if (fp->fileshort == filenum)
  128. return fp->filelong;
  129. fp = fp->next;
  130. }
  131. return 0;
  132. }
  133. /* Adds a file number and the number of indexed words
  134. ** to a hash table.
  135. */
  136. void addtofwordtotals(filenum, ftotalwords)
  137. int filenum;
  138. int ftotalwords;
  139. {
  140. unsigned hashval;
  141. struct fwordtotal *fp;
  142. char tmpstr[MAXSTRLEN];
  143. fp = (struct fwordtotal *) emalloc(sizeof(struct fwordtotal));
  144. fp->filenum = filenum;
  145. fp->totalwords = ftotalwords;
  146. fp->next = NULL;
  147. sprintf(tmpstr, "%d", filenum);
  148. hashval = bighash(tmpstr);
  149. fp->next = fwordtotals[hashval];
  150. fwordtotals[hashval] = fp;
  151. }
  152. /* Looks up a file number in the hash table and
  153. ** returns the total number of words indexed in it.
  154. */
  155. int gettotalwords(filenum)
  156. int filenum;
  157. {
  158. unsigned hashval;
  159. struct fwordtotal *fp;
  160. char tmpstr[MAXSTRLEN];
  161. sprintf(tmpstr, "%d", filenum);
  162. hashval = bighash(tmpstr);
  163. fp = fwordtotals[hashval];
  164. while (fp != NULL) {
  165. if (fp->filenum == filenum)
  166. return fp->totalwords;
  167. fp = fp->next;
  168. }
  169. return 0;
  170. }
  171. /* Adds a file number to a hash table of results.
  172. ** If the entry's alrady there, add the ranks,
  173. ** else make a new entry.
  174. */
  175. void mergeresulthashlist(filenum, rank, structure)
  176. int filenum;
  177. int rank;
  178. int structure;
  179. {
  180. unsigned hashval;
  181. struct result *rp, *newrp;
  182. char word[MAXWORDLEN];
  183. sprintf(word, "%d", filenum);
  184. hashval = hash(word);
  185. rp = resulthashlist[hashval];
  186. while (rp != NULL) {
  187. if (rp->filenum == filenum) {
  188. rp->rank += rank;
  189. rp->structure |= structure;
  190. return;
  191. }
  192. rp = rp->next;
  193. }
  194. newrp = (struct result *) emalloc(sizeof(struct result));
  195. newrp->filenum = filenum;
  196. newrp->rank = rank;
  197. newrp->structure = structure;
  198. newrp->next = resulthashlist[hashval];
  199. resulthashlist[hashval] = newrp;
  200. }
  201. /* Initializes the result hash list.
  202. */
  203. void initresulthashlist()
  204. {
  205. int i;
  206. for (i = 0; i < HASHSIZE; i++)
  207. resulthashlist[i] = NULL;
  208. }