Index: uspace/lib/cpp/include/impl/memory.hpp
===================================================================
--- uspace/lib/cpp/include/impl/memory.hpp	(revision aedae2871830a069b2669fbf5f22d8f19a175150)
+++ uspace/lib/cpp/include/impl/memory.hpp	(revision 999cb48e06b5198a645280ecd7dd3087b57942e0)
@@ -31,4 +31,5 @@
 
 #include <internal/aux.hpp>
+#include <internal/functional/hash.hpp>
 #include <internal/memory/allocator_arg.hpp>
 #include <internal/memory/addressof.hpp>
@@ -1098,4 +1099,20 @@
         return !(nullptr < ptr);
     }
+
+    /**
+     * 20.8.2.7, smart pointer hash support:
+     */
+
+    template<class T, class D>
+    struct hash<unique_ptr<T, D>>
+    {
+        size_t operator()(const unique_ptr<T, D>& ptr) const noexcept
+        {
+            return hash<typename unique_ptr<T, D>::pointer>{}(ptr.get());
+        }
+
+        using argument_type = unique_ptr<T, D>;
+        using result_type   = size_t;
+    };
 }
 
Index: uspace/lib/cpp/include/internal/memory/shared_ptr.hpp
===================================================================
--- uspace/lib/cpp/include/internal/memory/shared_ptr.hpp	(revision aedae2871830a069b2669fbf5f22d8f19a175150)
+++ uspace/lib/cpp/include/internal/memory/shared_ptr.hpp	(revision 999cb48e06b5198a645280ecd7dd3087b57942e0)
@@ -32,4 +32,5 @@
 #include <exception>
 #include <internal/functional/arithmetic_operations.hpp>
+#include <internal/functional/hash.hpp>
 #include <internal/memory/allocator_arg.hpp>
 #include <internal/memory/shared_payload.hpp>
@@ -605,4 +606,32 @@
         return os << ptr.get();
     }
+
+    /**
+     * 20.8.2.5, class template enable_shared_from_this:
+     */
+
+    // TODO: implement
+
+    /**
+     * 20.8.2.6, shared_ptr atomic access
+     */
+
+    // TODO: implement
+
+    /**
+     * 20.8.2.7, smart pointer hash support:
+     */
+
+    template<class T>
+    struct hash<shared_ptr<T>>
+    {
+        size_t operator()(const shared_ptr<T>& ptr) const noexcept
+        {
+            return hash<T*>{}(ptr.get());
+        }
+
+        using argument_type = shared_ptr<T>;
+        using result_type   = size_t;
+    };
 }
 
