X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fhash.c;h=f4e8b9fbbfd96d96f4193729e4da8f95b95a834c;hp=f63b3f50d25240541bf4904e727178260ff99cf3;hb=86e559d164166966a797a1e5855871d48e087ddd;hpb=2b0ff8e75f11c5fb58e16e95d8195d6f1252c97c diff --git a/src/hash.c b/src/hash.c index f63b3f5..f4e8b9f 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1,38 +1,21 @@ #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(int keyc, HKEY *keyv[], int tabsize) { - int i; - char *p; unsigned hashval = 0; + enum { + HASHNUM = 31 + }; - for(i = 0; i < keyc; i++) { + for(int i = 0; i < keyc; i++) { switch(keyv[i]->type) { case CHARS: - for(p = keyv[i]->val.s; *p != '\0'; p++) { - hashval = *p + 31 * hashval; + for(int j = 0; keyv[i]->val.s[j]; j++) { + hashval = keyv[i]->val.s[j] + HASHNUM * hashval; } break; case INT: - hashval = keyv[i]->val.i + 31 * hashval; + hashval = keyv[i]->val.i + HASHNUM * hashval; break; default: break;