バージョンアップ
[YACASL2.git] / src / hash.c
index b673d53..f4e8b9f 100644 (file)
@@ -1,9 +1,25 @@
-/* ハッシュ値を取得する */
-unsigned hash(const char *key, int size){
-    unsigned hashval;
+#include "hash.h"
 
-    for(hashval = 0; *key != '\0'; key++){
-        hashval = *key + 31 * hashval;
+unsigned hash(int keyc, HKEY *keyv[], int tabsize)
+{
+    unsigned hashval = 0;
+    enum {
+        HASHNUM = 31
+    };
+
+    for(int i = 0; i < keyc; i++) {
+        switch(keyv[i]->type) {
+        case CHARS:
+            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 + HASHNUM * hashval;
+            break;
+        default:
+            break;
+        }
     }
-    return hashval % size;
+    return (hashval % tabsize);
 }