#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;
+ int i, j;
unsigned hashval = 0;
+ enum {
+ HASHNUM = 31
+ };
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;
+ for(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;