casl2コマンド使い方の表示を変更
[YACASL2.git] / src / hash.c
1 #include "hash.h"
2
3 /* ハッシュ表のサイズを決めるため、引数の数値より大きい最小の素数を返す */
4 int hashtabsize(int size)
5 {
6     int i;
7     const int prime[] =
8         {2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
9          31, 37, 41, 43, 47, 53, 59, 61, 67,
10          71, 73, 79, 83, 89, 97,
11         };
12     for(i = 0; i < ARRAYSIZE(prime); i++) {
13         if(i > 0 && prime[i] >= size) {
14             break;
15         }
16     }
17     return prime[i];
18 }
19
20 /* ハッシュ値を取得する */
21 unsigned hash(int keyc, HKEY *keyv[], int tabsize)
22 {
23     int i;
24     char *p;
25     unsigned hashval = 0;
26
27     for(i = 0; i < keyc; i++) {
28         switch(keyv[i]->type) {
29         case CHARS:
30             for(p = keyv[i]->val.s; *p != '\0'; p++) {
31                 hashval = *p + 31 * hashval;
32             }
33             break;
34         case INT:
35             hashval = keyv[i]->val.i + 31 * hashval;
36             break;
37         default:
38             break;
39         }
40     }
41     return (hashval % tabsize);
42 }