]> granicus.if.org Git - libass/commitdiff
Simplify hash function
author11rcombs <rodger.combs@gmail.com>
Fri, 24 Jan 2014 01:09:46 +0000 (02:09 +0100)
committerGrigori Goronzy <greg@chown.ath.cx>
Sat, 25 Jan 2014 01:22:47 +0000 (02:22 +0100)
We can rely on fast multiplication and good compilers.

v2: use default FNV-1a prime

Signed-off-by: wm4 <wm4@nowhere>
Signed-off-by: Grigori Goronzy <greg@chown.ath.cx>
libass/ass_utils.h

index e5e0ecd1348857637d27b1201683819a92f13084..b797c8c93e76e32037277cdbfbd8c0d34e48f022 100644 (file)
@@ -119,7 +119,8 @@ static inline int rot_key(double a)
     return double_to_d22(a) % m;
 }
 
-#define FNV1_32A_INIT (unsigned)0x811c9dc5
+#define FNV1_32A_INIT 0x811c9dc5U
+#define FNV1_32A_PRIME 16777619U
 
 static inline unsigned fnv_32a_buf(void *buf, size_t len, unsigned hval)
 {
@@ -127,9 +128,7 @@ static inline unsigned fnv_32a_buf(void *buf, size_t len, unsigned hval)
     unsigned char *be = bp + len;
     while (bp < be) {
         hval ^= (unsigned) *bp++;
-        hval +=
-            (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) +
-            (hval << 24);
+        hval *= FNV1_32A_PRIME;
     }
     return hval;
 }
@@ -138,9 +137,7 @@ static inline unsigned fnv_32a_str(char *str, unsigned hval)
     unsigned char *s = (unsigned char *) str;
     while (*s) {
         hval ^= (unsigned) *s++;
-        hval +=
-            (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) +
-            (hval << 24);
+        hval *= FNV1_32A_PRIME;
     }
     return hval;
 }