]> source.dussan.org Git - rspamd.git/commitdiff
Add fuzzy hash utilities.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 20 Nov 2014 15:27:07 +0000 (15:27 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 20 Nov 2014 15:27:07 +0000 (15:27 +0000)
src/libutil/fuzzy.c
src/libutil/fuzzy.h

index 29a6a898c40ecf7a134c5605589b3914a89f83d9..a01377f245bb87079346ddeb07560f1a69c266e7 100644 (file)
@@ -30,6 +30,7 @@
 #include "message.h"
 #include "url.h"
 #include "main.h"
+#include "xxhash.h"
 
 #define ROLL_WINDOW_SIZE 9
 #define MIN_FUZZY_BLOCK_SIZE 3
@@ -501,6 +502,55 @@ fuzzy_compare_parts (struct mime_text_part *p1, struct mime_text_part *p2)
        return 0;
 }
 
+gint
+rspamd_fuzzy_len (fuzzy_hash_t *h)
+{
+       gint len;
+       void *nullpos;
+
+       nullpos = memchr (h->hash_pipe, '\0', sizeof (h->hash_pipe));
+
+       if (nullpos == NULL) {
+               len = sizeof (h->hash_pipe);
+       }
+       else {
+               len = (char *)nullpos - h->hash_pipe;
+       }
+
+       return len;
+}
+
+guint
+rspamd_fuzzy_hash (gconstpointer key)
+{
+       fuzzy_hash_t *fh = (fuzzy_hash_t *)key;
+       void *st;
+
+       st = XXH32_init (0xdeadbeef);
+       XXH32_update (st, &fh->block_size, sizeof (fh->block_size));
+       XXH32_update (st, fh->hash_pipe, rspamd_fuzzy_len (fh));
+
+       return XXH32_digest (st);
+}
+
+gboolean
+rspamd_fuzzy_equal (gconstpointer v1, gconstpointer v2)
+{
+       fuzzy_hash_t *fh1= (fuzzy_hash_t *)v1,
+                       *fh2 = (fuzzy_hash_t *)v2;
+
+       if (fh1->block_size == fh2->block_size) {
+               gint l1 = rspamd_fuzzy_len (fh1),
+                       l2 = rspamd_fuzzy_len (fh2);
+
+               if (l1 == l2) {
+                       return (memcmp (fh1->hash_pipe, fh2->hash_pipe, l1) == 0);
+               }
+       }
+
+       return FALSE;
+}
+
 /*
  * vi:ts=4
  */
index 22a7cbfe672c01277f15f4fc03def434279d6bd7..73bddad796b58ba2abe59b80ab88e26b2e0d9961 100644 (file)
@@ -67,5 +67,11 @@ gint fuzzy_compare_parts (struct mime_text_part *p1, struct mime_text_part *p2);
  */
 guint32 lev_distance (gchar *s1, gint len1, gchar *s2, gint len2);
 
+/*
+ * Hash table utilities
+ */
+gint rspamd_fuzzy_len (fuzzy_hash_t *h);
+guint rspamd_fuzzy_hash (gconstpointer key);
+gboolean rspamd_fuzzy_equal (gconstpointer v1, gconstpointer v2);
 
 #endif