]> git.kaiwu.me - klib.git/commitdiff
use FNV1a for strings
authorAttractive Chaos <attractor@live.co.uk>
Wed, 13 Dec 2023 01:18:41 +0000 (20:18 -0500)
committerAttractive Chaos <attractor@live.co.uk>
Wed, 13 Dec 2023 01:18:41 +0000 (20:18 -0500)
khashl.h

index 2d0f4137327952b64dc9fb7e96d7817193881326..3d41364c0834cfbfeaba5e855a3cc0b0250e2d64 100644 (file)
--- a/khashl.h
+++ b/khashl.h
@@ -342,9 +342,21 @@ static kh_inline khint_t kh_hash_uint64(khint64_t key) {
        return (khint_t)key;
 }
 
-static kh_inline khint_t kh_hash_str(const char *s) {
-       khint_t h = (khint_t)*s;
-       if (h) for (++s ; *s; ++s) h = (h << 5) - h + (khint_t)*s;
+#define KH_FNV_SEED 11
+
+static kh_inline khint_t kh_hash_str(const char *s) { /* FNV1a */
+       khint_t h = KH_FNV_SEED ^ 2166136261U;
+       const unsigned char *t = (const unsigned char*)s;
+       for (; *t; ++t)
+               h ^= *t, h *= 16777619;
+       return h;
+}
+
+static kh_inline khint_t kh_hash_bytes(int len, const unsigned char *s) {
+       khint_t h = KH_FNV_SEED ^ 2166136261U;
+       int i;
+       for (i = 0; i < len; ++i)
+               h ^= s[i], h *= 16777619;
        return h;
 }