net/addr/subnet: Add hashing functions

Change-Id: I18b9031ca652f72d1fb3a1df3d02c8506e9b423b
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/include/stdplus/net/addr/subnet.hpp b/include/stdplus/net/addr/subnet.hpp
index 5bcc17d..3b4ab0a 100644
--- a/include/stdplus/net/addr/subnet.hpp
+++ b/include/stdplus/net/addr/subnet.hpp
@@ -261,6 +261,15 @@
     }
 };
 
+template <typename Subnet>
+struct SubnetHash
+{
+    constexpr std::size_t operator()(Subnet addr) const noexcept
+    {
+        return stdplus::hashMulti(addr.getAddr(), addr.getPfx());
+    }
+};
+
 } // namespace detail
 
 template <typename Addr, typename Pfx>
@@ -292,3 +301,13 @@
 struct fmt::formatter<stdplus::SubnetAny, CharT> :
     stdplus::Format<stdplus::ToStr<stdplus::SubnetAny>, CharT>
 {};
+
+template <typename Addr, typename Pfx>
+struct std::hash<stdplus::detail::Subnet46<Addr, Pfx>> :
+    stdplus::detail::SubnetHash<stdplus::detail::Subnet46<Addr, Pfx>>
+{};
+
+template <>
+struct std::hash<stdplus::SubnetAny> :
+    stdplus::detail::SubnetHash<stdplus::SubnetAny>
+{};