Revert "Revert "Audit hashCode overrides outside of packages/flutter (#85370)" (#85451)" (#85567)

This reverts commit 2be0d57fa25423ffcba5a07d22ef9386a89dcf4c.
diff --git a/dev/bots/analyze.dart b/dev/bots/analyze.dart
index 35865ea..dc98d75 100644
--- a/dev/bots/analyze.dart
+++ b/dev/bots/analyze.dart
@@ -610,7 +610,7 @@
   }
 
   @override
-  int get hashCode => a ^ b ^ c ^ d;
+  int get hashCode => Object.hash(a, b, c, d);
 }
 
 // DO NOT ADD ANY ENTRIES TO THIS LIST.
diff --git a/dev/devicelab/lib/framework/running_processes.dart b/dev/devicelab/lib/framework/running_processes.dart
index a96254f..b07f1c1 100644
--- a/dev/devicelab/lib/framework/running_processes.dart
+++ b/dev/devicelab/lib/framework/running_processes.dart
@@ -28,20 +28,7 @@
   }
 
   @override
-  int get hashCode {
-    // TODO(dnfield): Replace this when Object.hashValues lands, https://github.com/dart-lang/sdk/issues/11617
-    int hash = 17;
-    if (pid != null) {
-      hash = hash * 23 + pid.hashCode;
-    }
-    if (commandLine != null) {
-      hash = hash * 23 + commandLine.hashCode;
-    }
-    if (creationDate != null) {
-      hash = hash * 23 + creationDate.hashCode;
-    }
-    return hash;
-  }
+  int get hashCode => Object.hash(pid, commandLine, creationDate);
 
   @override
   String toString() {
diff --git a/dev/devicelab/test/adb_test.dart b/dev/devicelab/test/adb_test.dart
index 018ce40..bd9cb6a 100644
--- a/dev/devicelab/test/adb_test.dart
+++ b/dev/devicelab/test/adb_test.dart
@@ -166,15 +166,14 @@
   }
 
   @override
-  int get hashCode => 17 * (17 * command.hashCode + _hashArguments) + _hashEnvironment;
-
-  int get _hashArguments => arguments != null
-    ? const ListEquality<String>().hash(arguments)
-    : null.hashCode;
-
-  int get _hashEnvironment => environment != null
-    ? const MapEquality<String, String>().hash(environment)
-    : null.hashCode;
+  int get hashCode {
+    return Object.hash(
+      command,
+      Object.hashAll(arguments ?? const <String>[]),
+      Object.hashAllUnordered(environment?.keys ?? const <String>[]),
+      Object.hashAllUnordered(environment?.values ?? const <String>[]),
+    );
+  }
 }
 
 class FakeDevice extends AndroidDevice {
diff --git a/dev/integration_tests/android_semantics_testing/lib/src/common.dart b/dev/integration_tests/android_semantics_testing/lib/src/common.dart
index 8879850..b01c2fc 100644
--- a/dev/integration_tests/android_semantics_testing/lib/src/common.dart
+++ b/dev/integration_tests/android_semantics_testing/lib/src/common.dart
@@ -183,8 +183,7 @@
   final double bottom;
 
   @override
-  int get hashCode =>
-      top.hashCode ^ left.hashCode ^ right.hashCode ^ bottom.hashCode;
+  int get hashCode => Object.hash(top, left, right, bottom);
 
   @override
   bool operator ==(Object other) {
@@ -216,7 +215,7 @@
   final double height;
 
   @override
-  int get hashCode => width.hashCode ^ height.hashCode;
+  int get hashCode => Object.hash(width, height);
 
   @override
   bool operator ==(Object other) {
diff --git a/dev/tools/localization/localizations_utils.dart b/dev/tools/localization/localizations_utils.dart
index 1209749..e3373dc 100644
--- a/dev/tools/localization/localizations_utils.dart
+++ b/dev/tools/localization/localizations_utils.dart
@@ -128,9 +128,7 @@
   }
 
   @override
-  int get hashCode {
-    return originalString.hashCode;
-  }
+  int get hashCode => originalString.hashCode;
 
   @override
   String toString() {
diff --git a/dev/tools/vitool/lib/vitool.dart b/dev/tools/vitool/lib/vitool.dart
index 0f0f4bc..e60bb71 100644
--- a/dev/tools/vitool/lib/vitool.dart
+++ b/dev/tools/vitool/lib/vitool.dart
@@ -274,7 +274,7 @@
   }
 
   @override
-  int get hashCode => size.hashCode ^ paths.hashCode;
+  int get hashCode => Object.hash(size, Object.hashAll(paths));
 
   @override
   String toString() {
@@ -328,7 +328,7 @@
   }
 
   @override
-  int get hashCode => id.hashCode ^ commands.hashCode ^ opacity.hashCode;
+  int get hashCode => Object.hash(id, Object.hashAll(commands), opacity);
 
   @override
   String toString() {
@@ -377,7 +377,7 @@
   }
 
   @override
-  int get hashCode => type.hashCode ^ points.hashCode;
+  int get hashCode => Object.hash(type, Object.hashAll(points));
 
   @override
   String toString() {
diff --git a/packages/flutter/lib/src/material/about.dart b/packages/flutter/lib/src/material/about.dart
index f8cbcba..3129e97 100644
--- a/packages/flutter/lib/src/material/about.dart
+++ b/packages/flutter/lib/src/material/about.dart
@@ -798,7 +798,7 @@
   }
 
   @override
-  int get hashCode => packageName.hashCode; // Good enough.
+  int get hashCode => hashValues(packageName, hashList(licenseEntries));
 }
 
 class _PackageLicensePage extends StatefulWidget {
diff --git a/packages/flutter_driver/lib/src/driver/driver.dart b/packages/flutter_driver/lib/src/driver/driver.dart
index 95763da..1973520 100644
--- a/packages/flutter_driver/lib/src/driver/driver.dart
+++ b/packages/flutter_driver/lib/src/driver/driver.dart
@@ -814,5 +814,5 @@
   }
 
   @override
-  int get hashCode => dx.hashCode ^ dy.hashCode;
+  int get hashCode => Object.hash(dx, dy);
 }
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index 4d88be9..09717f7 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -911,11 +911,7 @@
   }
 
   @override
-  int get hashCode {
-    return baseDir.hashCode
-        ^ relativeUri.hashCode
-        ^ entryUri.hashCode;
-  }
+  int get hashCode => Object.hash(baseDir, relativeUri, entryUri.hashCode);
 }
 
 // Given an assets directory like this:
diff --git a/packages/flutter_tools/lib/src/base/fingerprint.dart b/packages/flutter_tools/lib/src/base/fingerprint.dart
index ad8a8da..194f857 100644
--- a/packages/flutter_tools/lib/src/base/fingerprint.dart
+++ b/packages/flutter_tools/lib/src/base/fingerprint.dart
@@ -128,10 +128,7 @@
   }
 
   @override
-  // Ignore map entries here to avoid becoming inconsistent with equals
-  // due to differences in map entry order. This is a really bad hash
-  // function and should eventually be deprecated and removed.
-  int get hashCode => _checksums.length.hashCode;
+  int get hashCode => Object.hash(Object.hashAllUnordered(_checksums.keys), Object.hashAllUnordered(_checksums.values));
 
   @override
   String toString() => '{checksums: $_checksums}';
diff --git a/packages/flutter_tools/lib/src/base/version.dart b/packages/flutter_tools/lib/src/base/version.dart
index 4192f26..8989599 100644
--- a/packages/flutter_tools/lib/src/base/version.dart
+++ b/packages/flutter_tools/lib/src/base/version.dart
@@ -98,7 +98,7 @@
   }
 
   @override
-  int get hashCode => major ^ minor ^ patch;
+  int get hashCode => Object.hash(major, minor, patch);
 
   bool operator <(Version other) => compareTo(other) < 0;
   bool operator >(Version other) => compareTo(other) > 0;
diff --git a/packages/flutter_tools/lib/src/doctor_validator.dart b/packages/flutter_tools/lib/src/doctor_validator.dart
index d5488c0..f8ddc25 100644
--- a/packages/flutter_tools/lib/src/doctor_validator.dart
+++ b/packages/flutter_tools/lib/src/doctor_validator.dart
@@ -278,7 +278,7 @@
   }
 
   @override
-  int get hashCode => type.hashCode ^ message.hashCode ^ contextUrl.hashCode;
+  int get hashCode => Object.hash(type, message, contextUrl);
 }
 
 class NoIdeValidator extends DoctorValidator {
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index 78b2cc0..5e48bf9 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -302,7 +302,7 @@
   final EnvironmentType environmentType;
 
   @override
-  int get hashCode => scheme.hashCode ^ configuration.hashCode ^ environmentType.hashCode;
+  int get hashCode => Object.hash(scheme, configuration, environmentType);
 
   @override
   bool operator ==(Object other) {
diff --git a/packages/flutter_tools/lib/src/localizations/localizations_utils.dart b/packages/flutter_tools/lib/src/localizations/localizations_utils.dart
index 04fcca4..fd435e7 100644
--- a/packages/flutter_tools/lib/src/localizations/localizations_utils.dart
+++ b/packages/flutter_tools/lib/src/localizations/localizations_utils.dart
@@ -129,9 +129,7 @@
   }
 
   @override
-  int get hashCode {
-    return originalString.hashCode;
-  }
+  int get hashCode => originalString.hashCode;
 
   @override
   String toString() {
diff --git a/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart b/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart
index f710eb6..6fbd116 100644
--- a/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart
+++ b/packages/flutter_tools/lib/src/reporting/custom_dimensions.dart
@@ -326,12 +326,7 @@
   }
 
   @override
-  int get hashCode =>
-    toMap()
-      .values
-      .where((String element) => element != null)
-      .fold(Object().hashCode,
-            (int value, String element) => value ^ element.hashCode);
+  int get hashCode => Object.hashAll(toMap().values);
 }
 
 /// List of all fields used in CustomDimensions.
diff --git a/packages/flutter_tools/lib/src/reporting/usage.dart b/packages/flutter_tools/lib/src/reporting/usage.dart
index d822c7d..303ca50 100644
--- a/packages/flutter_tools/lib/src/reporting/usage.dart
+++ b/packages/flutter_tools/lib/src/reporting/usage.dart
@@ -486,7 +486,7 @@
   }
 
   @override
-  int get hashCode => command.hashCode ^ parameters.hashCode;
+  int get hashCode => Object.hash(command, parameters);
 
   @override
   String toString() => 'TestUsageCommand($command, parameters:$parameters)';
@@ -514,11 +514,7 @@
   }
 
   @override
-  int get hashCode => category.hashCode ^
-    parameter.hashCode ^
-    label.hashCode ^
-    value.hashCode ^
-    parameters.hashCode;
+  int get hashCode => Object.hash(category, parameter, label, value, parameters);
 
   @override
   String toString() => 'TestUsageEvent($category, $parameter, label:$label, value:$value, parameters:$parameters)';
@@ -544,10 +540,7 @@
   }
 
   @override
-  int get hashCode => category.hashCode ^
-    variableName.hashCode ^
-    duration.hashCode ^
-    label.hashCode;
+  int get hashCode => Object.hash(category, variableName, duration, label);
 
   @override
   String toString() => 'TestTimingEvent($category, $variableName, $duration, label:$label)';
diff --git a/packages/flutter_tools/lib/src/vscode/vscode.dart b/packages/flutter_tools/lib/src/vscode/vscode.dart
index 1a48053..8553722 100644
--- a/packages/flutter_tools/lib/src/vscode/vscode.dart
+++ b/packages/flutter_tools/lib/src/vscode/vscode.dart
@@ -326,5 +326,5 @@
 
   @override
   // Lowest bit is for isInsiders boolean.
-  int get hashCode => installPath.hashCode ^ extensionsFolder.hashCode ^ edition.hashCode;
+  int get hashCode => Object.hash(installPath, extensionsFolder, edition);
 }
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
index 65f413c..aab2b42 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
@@ -219,7 +219,7 @@
     verbose == other.verbose;
 
   @override
-  int get hashCode => workspacePath.hashCode;
+  int get hashCode => Object.hash(workspacePath, scheme, verbose);
 
   @override
   String toString() => '{$workspacePath, $scheme, $verbose}';