diff --git a/libi2pd/Garlic.h b/libi2pd/Garlic.h
index fa37bf66..e3b090cb 100644
--- a/libi2pd/Garlic.h
+++ b/libi2pd/Garlic.h
@@ -2,7 +2,7 @@
 #define GARLIC_H__
 
 #include <inttypes.h>
-#include <map>
+#include <unordered_map>
 #include <list>
 #include <string>
 #include <thread>
@@ -252,14 +252,14 @@ namespace garlic
 			// outgoing sessions
 			int m_NumTags;
 			std::mutex m_SessionsMutex;
-			std::map<i2p::data::IdentHash, ElGamalAESSessionPtr> m_Sessions;
-            std::map<i2p::data::Tag<32>, ECIESX25519AEADRatchetSessionPtr> m_ECIESx25519Sessions; // static key -> session
+			std::unordered_map<i2p::data::IdentHash, ElGamalAESSessionPtr> m_Sessions;
+            std::unordered_map<i2p::data::Tag<32>, ECIESX25519AEADRatchetSessionPtr> m_ECIESx25519Sessions; // static key -> session
 			// incoming
-			std::map<SessionTag, std::shared_ptr<AESDecryption> > m_Tags;
-            std::map<uint64_t, ECIESX25519AEADRatchetSessionPtr> m_ECIESx25519Tags; // session tag -> session
+			std::unordered_map<SessionTag, std::shared_ptr<AESDecryption> > m_Tags;
+            std::unordered_map<uint64_t, ECIESX25519AEADRatchetSessionPtr> m_ECIESx25519Tags; // session tag -> session
 			// DeliveryStatus
 			std::mutex m_DeliveryStatusSessionsMutex;
-			std::map<uint32_t, ElGamalAESSessionPtr> m_DeliveryStatusSessions; // msgID -> session
+			std::unordered_map<uint32_t, ElGamalAESSessionPtr> m_DeliveryStatusSessions; // msgID -> session
 
 		public:
 
diff --git a/libi2pd/Tag.h b/libi2pd/Tag.h
index 8af82241..010b160f 100644
--- a/libi2pd/Tag.h
+++ b/libi2pd/Tag.h
@@ -93,4 +93,16 @@ private:
 } // data
 } // i2p
 
+namespace std
+{
+    // hash for std::unordered_map
+    template<size_t sz> struct hash<i2p::data::Tag<sz> >
+    {
+        size_t operator()(const i2p::data::Tag<sz>& s) const 
+        {
+            return s.GetLL ()[0];
+        }
+    };    
+}
+
 #endif /* TAG_H__ */