]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add strfastcase_hash
authorAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 28 Jul 2017 06:47:09 +0000 (09:47 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 14 Aug 2017 11:51:13 +0000 (14:51 +0300)
Fast case-insensitive hashing which works by masking signed
bytes with 0x20.

src/lib/hash.c
src/lib/hash.h

index 2a2db8dfb552cfa10d1cb3b6e9878b37eb57017f..aa9716865e396714bb74a51837a06b16595881ed 100644 (file)
@@ -565,3 +565,19 @@ unsigned int mem_hash(const void *p, unsigned int size)
        return h;
 }
 
+unsigned int strfastcase_hash(const char *p)
+{
+       const unsigned char *s = (const unsigned char *)p;
+       unsigned int g, h = 0;
+
+       while (*s != '\0') {
+               h = (h << 4) + ((*s) & ~0x20);
+               if ((g = h & 0xf0000000UL) != 0) {
+                       h = h ^ (g >> 24);
+                       h = h ^ g;
+               }
+               s++;
+       }
+
+       return h;
+}
index d51d5cd8a5fea2790b8ccbe4329865db9293e9fd..53b2ffa89b5409ee049898230ede54184492180c 100644 (file)
@@ -170,6 +170,12 @@ void hash_table_copy(struct hash_table *dest, struct hash_table *src);
 /* hash function for strings */
 unsigned int str_hash(const char *p) ATTR_PURE;
 unsigned int strcase_hash(const char *p) ATTR_PURE;
+
+/* fast hash function which uppercases a-z. Does not work well
+   with input that consists from non number/letter input, as
+   it works by dropping 0x20. */
+unsigned int strfastcase_hash(const char *p) ATTR_PURE;
+
 /* a generic hash for a given memory block */
 unsigned int mem_hash(const void *p, unsigned int size) ATTR_PURE;