X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fhash.c;h=f63b3f50d25240541bf4904e727178260ff99cf3;hp=b673d535f3941c9723c423505b849ad7d3937a56;hb=f9e27534c723ae199ed32404047b9a2c6519a8a9;hpb=faec695d5b7ecf7dd3e4a07ac926ea93ca89020b diff --git a/src/hash.c b/src/hash.c index b673d53..f63b3f5 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1,9 +1,42 @@ +#include "hash.h" + +/* ハッシュ表のサイズを決めるため、引数の数値より大きい最小の素数を返す */ +int hashtabsize(int size) +{ + int i; + const int prime[] = + {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, + 71, 73, 79, 83, 89, 97, + }; + for(i = 0; i < ARRAYSIZE(prime); i++) { + if(i > 0 && prime[i] >= size) { + break; + } + } + return prime[i]; +} + /* ハッシュ値を取得する */ -unsigned hash(const char *key, int size){ - unsigned hashval; +unsigned hash(int keyc, HKEY *keyv[], int tabsize) +{ + int i; + char *p; + unsigned hashval = 0; - for(hashval = 0; *key != '\0'; key++){ - hashval = *key + 31 * hashval; + for(i = 0; i < keyc; i++) { + switch(keyv[i]->type) { + case CHARS: + for(p = keyv[i]->val.s; *p != '\0'; p++) { + hashval = *p + 31 * hashval; + } + break; + case INT: + hashval = keyv[i]->val.i + 31 * hashval; + break; + default: + break; + } } - return hashval % size; + return (hashval % tabsize); }