Remove allocations in some System.Net GetHashCode methods (#82095)
authorStephen Toub <stoub@microsoft.com>
Tue, 14 Feb 2023 21:29:13 +0000 (16:29 -0500)
committerGitHub <noreply@github.com>
Tue, 14 Feb 2023 21:29:13 +0000 (16:29 -0500)
* Remove allocations in some System.Net GetHashCode methods

* Address PR feedback

src/libraries/System.Net.Mail/src/System/Net/Mime/ContentDisposition.cs
src/libraries/System.Net.Mail/src/System/Net/Mime/ContentType.cs
src/libraries/System.Net.Primitives/src/System/Net/Cookie.cs
src/libraries/System.Net.Primitives/src/System/Net/DnsEndPoint.cs

index 8b60f28..a7af93e 100644 (file)
@@ -248,7 +248,7 @@ namespace System.Net.Mime
                 string.Equals(ToString(), rparam.ToString(), StringComparison.OrdinalIgnoreCase);
         }
 
-        public override int GetHashCode() => ToString().ToLowerInvariant().GetHashCode();
+        public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(ToString());
 
         [MemberNotNull(nameof(_dispositionType))]
         private void ParseValue()
index 9ca001f..2aa889e 100644 (file)
@@ -212,7 +212,7 @@ namespace System.Net.Mime
         public override bool Equals([NotNullWhen(true)] object? rparam) =>
             rparam == null ? false : string.Equals(ToString(), rparam.ToString(), StringComparison.OrdinalIgnoreCase);
 
-        public override int GetHashCode() => ToString().ToLowerInvariant().GetHashCode();
+        public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(ToString());
 
         // Helper methods.
         [MemberNotNull(nameof(_mediaType))]
index d9186c0..76d0b3c 100644 (file)
@@ -699,9 +699,7 @@ namespace System.Net
 
         public override bool Equals([NotNullWhen(true)] object? comparand)
         {
-            Cookie? other = comparand as Cookie;
-
-            return other != null
+            return comparand is Cookie other
                     && string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase)
                     && string.Equals(Value, other.Value, StringComparison.Ordinal)
                     && string.Equals(Path, other.Path, StringComparison.Ordinal)
@@ -711,7 +709,12 @@ namespace System.Net
 
         public override int GetHashCode()
         {
-            return (Name + "=" + Value + ";" + Path + "; " + Domain + "; " + Version).GetHashCode();
+            return HashCode.Combine(
+                StringComparer.OrdinalIgnoreCase.GetHashCode(Name),
+                StringComparer.Ordinal.GetHashCode(Value),
+                StringComparer.Ordinal.GetHashCode(Path),
+                StringComparer.OrdinalIgnoreCase.GetHashCode(Domain),
+                Version);
         }
 
         public override string ToString()
index 7707a5c..3a9972b 100644 (file)
@@ -33,52 +33,24 @@ namespace System.Net
             _family = addressFamily;
         }
 
-        public override bool Equals([NotNullWhen(true)] object? comparand)
-        {
-            DnsEndPoint? dnsComparand = comparand as DnsEndPoint;
+        public override bool Equals([NotNullWhen(true)] object? comparand) =>
+            comparand is DnsEndPoint dnsComparand &&
+            _family == dnsComparand._family &&
+            _port == dnsComparand._port &&
+            StringComparer.OrdinalIgnoreCase.Equals(_host, dnsComparand._host);
 
-            if (dnsComparand == null)
-            {
-                return false;
-            }
+        public override int GetHashCode() =>
+            HashCode.Combine(
+                (int)_family,
+                _port,
+                StringComparer.OrdinalIgnoreCase.GetHashCode(_host));
 
-            return (_family == dnsComparand._family &&
-                    _port == dnsComparand._port &&
-                    _host == dnsComparand._host);
-        }
+        public override string ToString() => $"{_family}/{_host}:{_port}";
 
-        public override int GetHashCode()
-        {
-            return StringComparer.OrdinalIgnoreCase.GetHashCode(ToString());
-        }
-
-        public override string ToString()
-        {
-            return _family + "/" + _host + ":" + _port;
-        }
-
-        public string Host
-        {
-            get
-            {
-                return _host;
-            }
-        }
+        public string Host => _host;
 
-        public override AddressFamily AddressFamily
-        {
-            get
-            {
-                return _family;
-            }
-        }
+        public override AddressFamily AddressFamily => _family;
 
-        public int Port
-        {
-            get
-            {
-                return _port;
-            }
-        }
+        public int Port => _port;
     }
 }