Update local gold api (#90072)

diff --git a/packages/flutter_goldens/test/flutter_goldens_test.dart b/packages/flutter_goldens/test/flutter_goldens_test.dart
index 74468da..b680c0f 100644
--- a/packages/flutter_goldens/test/flutter_goldens_test.dart
+++ b/packages/flutter_goldens/test/flutter_goldens_test.dart
@@ -210,7 +210,7 @@
       );
     });
 
-    test('Creates traceID correctly', () {
+    test('Creates traceID correctly', () async {
       String traceID;
       platform = FakePlatform(
         environment: <String, String>{
@@ -231,11 +231,19 @@
         httpClient: fakeHttpClient,
       );
 
-      traceID = skiaClient.getTraceID('flutter.golden.1');
-
+      RunInvocation md5 = const RunInvocation(
+        <String>[
+          'md5',
+          '-s',
+          '{"CI":"luci","Platform":"linux","name":"flutter.golden.1","source_type":"flutter"}',
+        ],
+        null,
+      );
+      process.processResults[md5] = ProcessResult(12345678, 0, '12345678', '');
+      traceID = await skiaClient.getTraceID('flutter.golden.1');
       expect(
         traceID,
-        equals(',CI=luci,Platform=linux,name=flutter.golden.1,source_type=flutter,'),
+        equals('12345678'),
       );
 
       // Browser
@@ -258,12 +266,19 @@
         platform: platform,
         httpClient: fakeHttpClient,
       );
-
-      traceID = skiaClient.getTraceID('flutter.golden.1');
-
+      md5 = const RunInvocation(
+        <String>[
+          'md5',
+          '-s',
+          '{"Browser":"chrome","CI":"luci","Platform":"linux","name":"flutter.golden.1","source_type":"flutter"}',
+        ],
+        null,
+      );
+      process.processResults[md5] = ProcessResult(12345678, 0, '12345678', '');
+      traceID = await skiaClient.getTraceID('flutter.golden.1');
       expect(
         traceID,
-        equals(',Browser=chrome,CI=luci,Platform=linux,name=flutter.golden.1,source_type=flutter,'),
+        equals('12345678'),
       );
 
       // Locally - should defer to luci traceID
@@ -281,12 +296,19 @@
         platform: platform,
         httpClient: fakeHttpClient,
       );
-
-      traceID = skiaClient.getTraceID('flutter.golden.1');
-
+      md5 = const RunInvocation(
+        <String>[
+          'md5',
+          '-s',
+          '{"CI":"luci","Platform":"macos","name":"flutter.golden.1","source_type":"flutter"}',
+        ],
+        null,
+      );
+      process.processResults[md5] = ProcessResult(12345678, 0, '12345678', '');
+      traceID = await skiaClient.getTraceID('flutter.golden.1');
       expect(
         traceID,
-        equals(',CI=luci,Platform=macos,name=flutter.golden.1,source_type=flutter,'),
+        equals('12345678'),
       );
     });
 
diff --git a/packages/flutter_goldens_client/lib/skia_client.dart b/packages/flutter_goldens_client/lib/skia_client.dart
index 66bdc71..7193c63 100644
--- a/packages/flutter_goldens_client/lib/skia_client.dart
+++ b/packages/flutter_goldens_client/lib/skia_client.dart
@@ -285,10 +285,10 @@
   /// Gold at head.
   Future<String?> getExpectationForTest(String testName) async {
     late String? expectation;
-    final String traceID = getTraceID(testName);
+    final String traceID = await getTraceID(testName);
     await io.HttpOverrides.runWithHttpOverrides<Future<void>>(() async {
       final Uri requestForExpectations = Uri.parse(
-        'https://flutter-gold.skia.org/json/v1/latestpositivedigest/$traceID'
+        'https://flutter-gold.skia.org/json/v2/latestpositivedigest/$traceID'
       );
       late String rawResponse;
       try {
@@ -410,20 +410,20 @@
   }
 
   /// Returns a trace id based on the current testing environment to lookup
-  /// the latest positive digest on Flutter Gold.
-  ///
-  /// Trace IDs are case sensitive and should be in alphabetical order for the
-  /// keys, followed by the rest of the paramset, also in alphabetical order.
-  /// There should also be leading and trailing commas.
-  ///
-  /// Example TraceID for Flutter Gold:
-  ///   ',CI=cirrus,Platform=linux,name=cupertino.activityIndicator.inprogress.1.0,source_type=flutter,'
-  String getTraceID(String testName) {
-    return '${platform.environment[_kTestBrowserKey] == null ? ',' : ',Browser=${platform.environment[_kTestBrowserKey]},'}'
-      'CI=luci,'
-      'Platform=${platform.operatingSystem},'
-      'name=$testName,'
-      'source_type=flutter,';
+  /// the latest positive digest on Flutter Gold with a hex-encoded md5 hash of
+  /// the image keys.
+  Future<String> getTraceID(String testName) async {
+    final Map<String, dynamic> keys = <String, dynamic>{
+      if (platform.environment[_kTestBrowserKey] != null) 'Browser' : platform.environment[_kTestBrowserKey],
+      'CI' : 'luci',
+      'Platform' : platform.operatingSystem,
+      'name' : testName,
+      'source_type' : 'flutter',
+    };
+    final String jsonTrace = json.encode(keys);
+    final io.ProcessResult md5Result = await process.run(<String>['md5', '-s', jsonTrace]);
+    final String md5Sum = md5Result.stdout.toString().split(' ').last.trim();
+    return md5Sum;
   }
 }