]> source.dussan.org Git - rspamd.git/commitdiff
Add routines to use rspamd_inet_addr_t in hash tables
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 14 Dec 2015 11:03:31 +0000 (11:03 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 14 Dec 2015 11:03:31 +0000 (11:03 +0000)
src/libutil/addr.c
src/libutil/addr.h

index 2b5ca98547984bb5c07abf2d96fb9373f72781a8..1da69e114122295f1a8ed0e4bfcb4f22973d9b9b 100644 (file)
@@ -25,6 +25,7 @@
 #include "addr.h"
 #include "util.h"
 #include "logger.h"
+#include "xxhash.h"
 
 #include "unix-std.h"
 /* pwd and grp */
@@ -1276,3 +1277,32 @@ rspamd_inet_address_get_af (const rspamd_inet_addr_t *addr)
 
        return addr->af;
 }
+
+
+guint
+rspamd_inet_address_hash (gconstpointer a)
+{
+       const rspamd_inet_addr_t *addr = a;
+       XXH64_state_t st;
+
+       XXH64_reset (&st, rspamd_hash_seed ());
+       XXH64_update (&st, &addr->af, sizeof (addr->af));
+
+
+       if (addr->u.un) {
+               XXH64_update (&st, addr->u.un, sizeof (*addr->u.un));
+       }
+       else {
+               XXH64_update (&st, &addr->u.in.addr, addr->slen);
+       }
+
+       return XXH64_digest (&st);
+}
+
+gboolean
+rspamd_inet_address_equal (gconstpointer a, gconstpointer b)
+{
+       const rspamd_inet_addr_t *a1 = a, *a2 = b;
+
+       return rspamd_inet_address_compare (a1, a2) == 0;
+}
index d686fa52a8f76ace72c6b4b4a9655a98ad49aba3..fa2e4e65b2511efbe30385cf53188c9e1f5d3845 100644 (file)
@@ -249,4 +249,15 @@ gint rspamd_inet_address_compare_ptr (gconstpointer a1,
  */
 rspamd_inet_addr_t *rspamd_inet_address_copy (const rspamd_inet_addr_t *addr);
 
+/**
+ * Returns hash for inet address
+ */
+guint rspamd_inet_address_hash (gconstpointer a);
+
+
+/**
+ * Returns true if two address are equal
+ */
+gboolean rspamd_inet_address_equal (gconstpointer a, gconstpointer b);
+
 #endif /* ADDR_H_ */